サーバーからサイズの大きなメディア ファイルをダウンロードする場合は、再開可能なメディア ダウンロードを使用してファイルをチャンクごとにダウンロードします。Google API で生成されるライブラリには、再開可能なメディアのダウンロードを操作するための便利なメソッドが含まれています。
再開可能メディア ダウンロード プロトコルは、Google Drive API ドキュメントで説明されている再開可能なメディア アップロード プロトコルに類似しています。
実装の詳細
主なクラスは MediaHttpDownloader と MediaHttpDownloaderProgressListener です。メディア コンテンツはチャンクでダウンロードされます。チャンクサイズは構成可能です。リクエストでサーバーエラーが発生すると、リクエストが再試行されます。
サービス固有の生成済みライブラリのメソッドがディスカバリ ドキュメントでのダウンロードをサポートしている場合、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);