В этом документе описано, как использовать прямую и возобновляемую загрузку медиафайлов с помощью клиентской библиотеки API Google для Java.
Возобновляемая загрузка медиафайлов
При загрузке большого медиафайла на сервер используйте возобновляемую загрузку, чтобы отправлять файл по частям. Библиотеки, созданные с помощью API Google, содержат удобные методы для взаимодействия с возобновляемой загрузкой медиафайлов.
Протокол возобновляемой загрузки медиафайлов похож на протокол, описанный в документации по Google Drive API.
Разработка протокола
На схеме ниже показано, как работает протокол возобновляемой загрузки медиаконтента.

Особенности реализации
Основными классами являются MediaHttpUploader и MediaHttpProgressListener.
Если методы в сгенерированных библиотеках для конкретных сервисов содержат параметр mediaUpload в документе Discovery, то для них создается удобный метод, который принимает InputStreamContent в качестве параметра. Подробнее о загрузке медиаконтента с помощью Google APIs Discovery Service…
Например, метод insert Drive API поддерживает mediaUpload, и вы можете использовать следующий код для загрузки файла:
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();
Вы также можете использовать функцию возобновляемой загрузки медиаконтента без сгенерированных библиотек для конкретных сервисов. Пример:
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); }
Прямая загрузка медиафайлов
Возобновляемая загрузка медиафайлов включена по умолчанию, но вы можете отключить ее и использовать прямую загрузку, например если вы загружаете небольшой файл. Прямая загрузка медиаконтента была добавлена в клиентскую библиотеку API Google для Java версии 1.9.0-beta.
При прямой загрузке медиаконтента весь файл загружается за один HTTP-запрос, в отличие от протокола возобновляемой загрузки, при котором файл загружается за несколько запросов. Прямая загрузка позволяет сократить количество HTTP-запросов, но повышает вероятность сбоев (например, из-за проблем с подключением), которые могут возникать при загрузке больших файлов.
Использование прямой загрузки медиаконтента аналогично описанному выше для возобновляемой загрузки медиаконтента, за исключением следующего вызова, который сообщает MediaHttpUploader о необходимости выполнять только прямую загрузку:
mediaHttpUploader.setDirectUploadEnabled(true);