Bezpośrednie i wznawiane przesyłanie multimediów

Z tego dokumentu dowiesz się, jak korzystać z bezpośredniego i wznawianego przesyłania multimediów za pomocą i bibliotekę klienta interfejsów API Google do języka Java.

Przesyłanie multimediów z możliwością wznowienia

Gdy przesyłasz duży plik multimedialny na serwer, użyj funkcji wznawiania przesyłania multimediów, aby: możesz wysyłać go fragmentami. Biblioteki wygenerowane przez interfejs API Google zawierają wygodnych metod umożliwiających wznawianie przesyłania multimediów.

Protokół przesyłania multimediów z możliwością wznowienia jest podobny do przesyłania multimediów z możliwością wznawiania i opisany w dokumentacji interfejsu Google Drive API.

Projekt protokołu

Poniższy diagram przedstawia, jak działa protokół przesyłania multimediów z możliwością wznowienia:
Diagram sekwencji pokazujący, jak żądania i odpowiedzi są przesyłane między klientem a serwerem.

Szczegóły implementacji

Interesujące Cię główne kategorie to MediaHttpUploader i MediaHttpProgressListener.

Jeśli metody w bibliotekach wygenerowanych na poziomie usługi zawierają atrybut mediaUpload w dokumencie opisującym, dla tych metod, które wymagają InputStreamContent . (Więcej informacji o przesyłaniu multimediów za pomocą interfejsów API Google Discovery Service, patrz Przesłanie multimediów)

Na przykład metoda insert w interfejsie Drive API obsługuje mediaUpload. Do przesłania pliku możesz użyć tego kodu:

class CustomProgressListener implements MediaHttpUploaderProgressListener {
 
public void progressChanged(MediaHttpUploader uploader) throws IOException {
   
switch (uploader.getUploadState()) {
     
case INITIATION_STARTED:
       
System.out.println("Initiation has started!");
       
break;
     
case INITIATION_COMPLETE:
       
System.out.println("Initiation is complete!");
       
break;
     
case MEDIA_IN_PROGRESS:
       
System.out.println(uploader.getProgress());
       
break;
     
case MEDIA_COMPLETE:
       
System.out.println("Upload is complete!");
   
}
 
}
}

File mediaFile = new File("/tmp/driveFile.jpg");
InputStreamContent mediaContent =
   
new InputStreamContent("image/jpeg",
       
new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent
.setLength(mediaFile.length());

Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent);
request
.getMediaHttpUploader().setProgressListener(new CustomProgressListener());
request
.execute();

Możesz też korzystać z funkcji przesyłania multimediów z możliwością wznowienia bez określonej usługi z wygenerowanymi bibliotekami. Oto przykład:

File mediaFile = new File("/tmp/Test.jpg");
InputStreamContent mediaContent =
   
new InputStreamContent("image/jpeg",
       
new BufferedInputStream(new FileInputStream(mediaFile)));
mediaContent
.setLength(mediaFile.length());



MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, transport, httpRequestInitializer);
uploader
.setProgressListener(new CustomProgressListener());
HttpResponse response = uploader.upload(requestUrl);
if (!response.isSuccessStatusCode()) {
 
throw GoogleJsonResponseException(jsonFactory, response);
}

Bezpośrednie przesyłanie multimediów

Przesyłanie multimediów z możliwością wznowienia jest domyślnie włączone, ale możesz je wyłączyć i korzystać do bezpośredniego przesyłania multimediów, np. wtedy, gdy przesyłasz mały plik. Bezpośrednie przesyłanie multimediów zostało wprowadzone w 1.9.0-beta biblioteki klienta interfejsów API Google dla języka Java.

Bezpośrednie przesyłanie multimediów powoduje przesłanie całego pliku w jednym żądaniu HTTP, a nie protokół przesyłania multimediów z możliwością wznowienia, który przesyła plik w wielu żądaniach. Bezpośrednie przesyłanie zmniejsza liczbę żądań HTTP, ale zwiększa ryzyko awarii (np. awarii połączenia), które mogą wystąpić w przypadku dużych przesłanych plików.

Korzystanie z bezpośredniego przesyłania multimediów jest takie samo jak opisane powyżej w przypadku przesyłanie multimediów z możliwością wznowienia oraz wywołanie MediaHttpUploader aby przesyłać tylko pliki bezpośrednie:

mediaHttpUploader.setDirectUploadEnabled(true);