Bezpośrednie i wznowione przesyłanie multimediów

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

W tym dokumencie opisaliśmy sposoby bezpośredniego i wznawiania przesyłania multimediów przy użyciu biblioteki klienta interfejsu API Google dla języka Java.

Przesyłanie możliwe do wznowienia

Gdy przesyłasz duży plik multimedialny na serwer, użyj wznowionego przesyłania multimediów, aby podzielić plik według fragmentów. Biblioteki wygenerowane przez interfejs API Google zawierają wygodne metody interakcji z możliwością przesyłania multimediów.

Protokół przesyłania multimediów, który można wznowić, jest podobny do protokołu przesyłania plików wznowionego zgodnie z opisem w dokumentacji interfejsu Google Drive API.

Protokół

Ten schemat sekwencji pokazuje, jak działa wznawiany protokół przesyłania multimediów:
Diagram sekwencji pokazujący sposób przemieszczania żądań i odpowiedzi między klientem a serwerem.

Szczegóły implementacji

Główne kategorie zainteresowań to MediaHttpUploader i MediaHttpProgressListener.

Jeśli metody w bibliotekach wygenerowanych przez daną usługę zawierają parametr mediaUpload w dokumencie Discovery, zostanie utworzona metoda dogodna, która przyjmuje parametr InputStreamContent jako parametr. (Więcej informacji o przesyłaniu multimediów za pomocą usługi wykrywania interfejsów API Google znajdziesz w artykule Przesyłanie multimediów).

Na przykład metoda insert interfejsu API Dysku obsługuje znaczniki mediaUpload. Aby przesłać plik, 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ż użyć funkcji przesyłania multimediów, która umożliwia wznowienie usługi bez bibliotek wygenerowanych przez daną usługę. 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 do wznowienia jest domyślnie włączone, ale możesz je wyłączyć i korzystać z bezpośredniego przesyłania multimediów (na przykład w przypadku przesyłania małego pliku). Bezpośrednie przesyłanie multimediów zostało wprowadzone w 1.9.0-beta wersji biblioteki klienta interfejsu API Google dla języka Java.

W przypadku bezpośredniego przesyłania plików multimedialnych cały plik jest przesyłany w jednym żądaniu HTTP, a nie w odpowiedzi na wznowienie przesyłania multimediów, które jest przesyłane w ramach wielu żądań. Bezpośrednie przesyłanie zmniejsza liczbę żądań HTTP, ale zwiększa prawdopodobieństwo niepowodzenia (np. awarii połączenia), które może wystąpić w przypadku dużych plików.

Użycie przesyłania bezpośredniego jest takie samo jak opisane powyżej w przypadku wznowienia przesyłania multimediów oraz to wywołanie MediaHttpUploader, które przesyła tylko dane bezpośrednie:

mediaHttpUploader.setDirectUploadEnabled(true);