Возобновляемое скачивание медиафайлов

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

Протокол возобновляемого скачивания медиафайлов похож на протокол возобновляемой загрузки медиафайлов, который описан в документации по Google Drive API.

Особенности реализации

Основными классами являются MediaHttpDownloader и MediaHttpDownloaderProgressListener. Медиаконтент скачивается фрагментами, размер которых можно настраивать. Если при выполнении запроса возникает ошибка сервера, запрос повторяется.

Если методы в сгенерированных библиотеках для конкретных сервисов поддерживают скачивание в документе discovery, то для этих методов создается удобный метод скачивания, который принимает OutputStream. Подробнее о том, как использовать скачивание медиаконтента со службой обнаружения API Google…

Пример:

class CustomProgressListener implements MediaHttpDownloaderProgressListener {
  public void progressChanged(MediaHttpDownloader downloader) {
    switch (downloader.getDownloadState()) {
      case MEDIA_IN_PROGRESS:
        System.out.println(downloader.getProgress());
        break;
      case MEDIA_COMPLETE:
        System.out.println("Download is complete!");
    }
  }
}

OutputStream out = new FileOutputStream("/tmp/driveFile.jpg");

DriveFiles.Get request = drive.files().get(fileId);
request.getMediaHttpDownloader().setProgressListener(new CustomProgressListener());
request.executeMediaAndDownloadTo(out);

Вы также можете использовать эту функцию без сгенерированных библиотек для конкретных сервисов. Пример:

OutputStream out = new FileOutputStream("/tmp/Test.jpg");

MediaHttpDownloader downloader = new MediaHttpDownloader(transport, httpRequestInitializer);
downloader.setProgressListener(new CustomProgressListener());
downloader.download(requestUrl, out);

Прямое скачивание медиафайлов

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

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

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

mediaHttpDownloader.setDirectDownloadEnabled(true);