При загрузке большого медиафайла с сервера используйте возобновляемую загрузку мультимедиа , чтобы загружать файл по частям. Библиотеки, созданные API Google, содержат удобные методы для взаимодействия с возобновляемой загрузкой мультимедиа.
Протокол возобновляемой загрузки мультимедиа аналогичен протоколу возобновляемой загрузки мультимедиа, который описан в документации 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);
Прямая загрузка мультимедиа
Возобновляемая загрузка мультимедиа включена по умолчанию, но вы можете отключить ее и вместо этого использовать прямую загрузку мультимедиа, например, если вы загружаете небольшой файл. Прямая загрузка мультимедиа была представлена в бета-версии клиентской библиотеки Google API для Java 1.9.0 .
Прямая загрузка мультимедиа загружает весь медиаконтент за один HTTP-запрос, в отличие от протокола возобновляемой загрузки мультимедиа, который может загружать несколько запросов. Выполнение прямой загрузки уменьшает количество HTTP-запросов, но увеличивает вероятность сбоев (например, сбоев соединения), которые могут произойти при больших загрузках.
Использование такое же, как описано выше, плюс следующий вызов, который сообщает MediaHttpDownloader о необходимости прямой загрузки:
mediaHttpDownloader.setDirectDownloadEnabled(true);