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