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