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);