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

В этом документе описывается, как использовать прямую и возобновляемую загрузку мультимедиа с клиентской библиотекой Google API для Java.

Возобновляемая загрузка мультимедиа

Когда вы загружаете большой медиафайл на сервер, используйте возобновляемую загрузку мультимедиа , чтобы отправлять файл по частям. Библиотеки, созданные API Google, содержат удобные методы для взаимодействия с возобновляемой загрузкой мультимедиа.

Протокол возобновляемой загрузки мультимедиа аналогичен протоколу возобновляемой загрузки мультимедиа, описанному в документации API Google Диска .

Разработка протокола

На следующей диаграмме последовательности показано, как работает протокол возобновляемой загрузки мультимедиа:
Диаграмма последовательности, показывающая, как запросы и ответы перемещаются между клиентом и сервером.

Детали реализации

Основные представляющие интерес классы — MediaHttpUploader и MediaHttpProgressListener .

Если методы в созданных для конкретной службы библиотеках содержат параметр mediaUpload в документе Discovery , то для этих методов создается удобный метод, который принимает InputStreamContent в качестве параметра. (Подробнее об использовании загрузки мультимедиа с помощью службы обнаружения API Google см. в разделе Загрузка мультимедиа .)

Например, метод 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); }

Прямая загрузка мультимедиа

Возобновляемая загрузка мультимедиа включена по умолчанию, но вы можете отключить ее и вместо этого использовать прямую загрузку мультимедиа, например, если вы загружаете небольшой файл. Прямая загрузка мультимедиа была представлена ​​в бета-версии клиентской библиотеки Google API для Java 1.9.0 .

Прямая загрузка мультимедиа загружает весь файл в одном HTTP-запросе, в отличие от протокола возобновляемой загрузки мультимедиа, который загружает файл в нескольких запросах. Выполнение прямой загрузки уменьшает количество HTTP-запросов, но увеличивает вероятность сбоев (например, сбоев соединения), которые могут произойти при больших загрузках.

Использование прямой загрузки мультимедиа такое же, как описано выше для возобновляемой загрузки мультимедиа, плюс следующий вызов, который сообщает MediaHttpUploader выполнять только прямую загрузку:

mediaHttpUploader.setDirectUploadEnabled(true);