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

Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.

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

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

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

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

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

mediaHttpUploader.setDirectUploadEnabled(true);