可续传媒体下载

从服务器下载大型媒体文件时,您可以使用可续传媒体下载功能按分块下载文件。Google API 生成的库包含一些可与可续传媒体下载互动的便捷方法。

可续传媒体下载协议类似于可续传媒体上传协议,详见 Google Drive API 文档

实现细节

相关的主要类是 MediaHttpDownloaderMediaHttpDownloaderProgressListener。媒体内容会分块下载,分块大小可配置。如果请求遇到服务器错误,系统会重试该请求。

如果服务专用的生成库中的方法支持在发现文档中进行下载,则系统会为这些采用 OutputStream 的方法创建一个便捷的下载方法。(如需详细了解如何将媒体下载与 Google API 发现服务结合使用,请参阅媒体下载。)

例如:

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);