Bezpośrednie i wznawiane przesyłanie multimediów

Ten dokument opisuje, jak korzystać z bezpośredniego i wznawianego przesyłania multimediów za pomocą biblioteki klienta interfejsu API Google dla języka Java.

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

Gdy przesyłasz na serwer duży plik multimedialny, użyj funkcji odtwarzania multimediów, aby wysłać jeden fragment pliku. Biblioteki wygenerowane przez interfejs API Google zawierają wygodne metody interakcji z przesyłaniem multimediów wznawianych.

Protokół przesyłania multimediów wznawianych jest podobny do protokołu przesyłania multimediów wznowionego w dokumentacji interfejsu Google Drive API.

Konstrukcja protokołu

Ten diagram pokazuje, jak działa protokół przesyłania multimediów wznawianych:
Diagram sekwencji pokazujący przepływ żądań i odpowiedzi między klientem a serwerem.

Szczegóły implementacji

Główne klasy, które Cię interesują, to MediaHttpUploader i MediaHttpProgressListener.

Jeśli metody w bibliotekach generowanych dla konkretnych usług zawierają parametr mediaUpload w dokumencie Discovery, tworzona jest dla nich wygodna metoda, która wykorzystuje parametr InputStreamContent. Więcej informacji o korzystaniu z przesyłania multimediów za pomocą usługi Discovery interfejsu API Google znajdziesz w artykule Przesyłanie multimediów.

Na przykład metoda insert Drive API obsługuje mediaUpload i możesz przesłać plik za pomocą 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 wznawiania przesyłania multimediów bez bibliotek wygenerowanych dla danej usługi. 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

Funkcja wznawiania przesyłania multimediów jest domyślnie włączona, ale możesz ją wyłączyć i zamiast niej skorzystać z bezpośredniego przesyłania multimediów, na przykład jeśli przesyłasz mały plik. Bezpośrednie przesyłanie multimediów zostało wprowadzone w wersji 1.9.0-beta biblioteki klienta interfejsów API Google dla języka Java.

Bezpośrednie przesyłanie multimediów przesyła cały plik w ramach 1 żądania HTTP, w odróżnieniu od protokołu wznawiania przesyłania multimediów, który przesyła plik w wielu żądaniach. Bezpośrednie przesyłanie zmniejsza liczbę żądań HTTP, ale zwiększa ryzyko niepowodzenia (np. nieudanego połączenia), które mogą wystąpić w przypadku przesyłania dużych ilości danych.

Sposób użycia bezpośredniego przesyłania multimediów jest taki sam jak w przypadku wznawiania przesyłania multimediów. Zwróć uwagę na to wywołanie, które informuje narzędzie MediaHttpUploader, że ma przeprowadzać tylko przesyłanie bezpośrednie:

mediaHttpUploader.setDirectUploadEnabled(true);