Прямая и возобновляемая загрузка медиафайлов

В этом документе описано, как использовать прямую и возобновляемую загрузку медиафайлов с помощью клиентской библиотеки 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);