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