再開可能なメディア ダウンロード

サーバーからサイズの大きなメディア ファイルをダウンロードする場合は、再開可能なメディア ダウンロードを使用してファイルをチャンクごとにダウンロードします。Google API で生成されるライブラリには、再開可能なメディアのダウンロードを操作するための便利なメソッドが含まれています。

再開可能メディア ダウンロード プロトコルは、Google Drive API ドキュメントで説明されている再開可能なメディア アップロード プロトコルに類似しています。

実装の詳細

主なクラスは MediaHttpDownloaderMediaHttpDownloaderProgressListener です。メディア コンテンツはチャンクでダウンロードされます。チャンクサイズは構成可能です。リクエストでサーバーエラーが発生すると、リクエストが再試行されます。

サービス固有の生成済みライブラリのメソッドがディスカバリ ドキュメントでのダウンロードをサポートしている場合、OutputStream を受け取るこれらのメソッド用に、便利なダウンロード メソッドが作成されます。(Google APIs 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 バージョンで導入されました。

直接メディア ダウンロードでは、複数のリクエストでダウンロードできる再開可能なメディア ダウンロード プロトコルとは異なり、1 つの HTTP リクエストでメディア コンテンツ全体がダウンロードされます。直接ダウンロードを行うと、HTTP リクエストの数は減りますが、大規模なダウンロードで失敗する(接続の失敗など)可能性は高くなります。

使い方は前述の説明と同じですが、MediaHttpDownloader に直接ダウンロードするよう指示する次の呼び出しもあります。

mediaHttpDownloader.setDirectDownloadEnabled(true);