从服务器下载大型媒体文件时,请使用可续传媒体下载功能逐块下载文件。Google API 生成的库包含与可续传媒体下载互动的便捷方法。
可续传媒体下载协议与可续传媒体上传协议类似,如 Google Drive API 文档中所述。
实现细节
主要涉及的类是 MediaHttpDownloader 和 MediaHttpDownloaderProgressListener。媒体内容分块下载,块大小可配置。如果请求中出现服务器错误,系统会重试请求。
如果服务专用生成的库中的方法支持在发现文档中下载,那么系统会为接受 OutputStream 的这些方法创建便捷的下载方法。(如需详细了解如何在 Google API Discovery Service 中使用媒体下载功能,请参阅媒体下载。)
例如:
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);
直接下载媒体
可续传媒体下载默认处于启用状态,不过您可以将其停用,并改用直接媒体下载功能(例如,在下载小文件时)。 直接媒体下载是在 Java 版 Google API 客户端库的 1.9.0-beta 版本中引入的。
与可续传媒体下载协议(可在多个请求中下载)相反,直接媒体下载会通过一个 HTTP 请求下载整个媒体内容。直接下载会减少 HTTP 请求的数量,但会增加下载大量文件时发生故障(例如连接失败)的机会。
此用法与上述内容相同,另外还有以下调用,告知 MediaHttpDownloader 执行直接下载操作:
mediaHttpDownloader.setDirectDownloadEnabled(true);