このドキュメントでは、Java 用 Google API クライアント ライブラリで直接アップロードと再開可能なメディアをアップロードする方法について説明します。
再開可能なメディアのアップロード
大きなメディア ファイルをサーバーにアップロードするときは、再開可能なメディアのアップロードを使用して、チャンクごとにファイル チャンクを送信します。Google API が生成したライブラリには、再開可能なメディア アップロードを操作するためのコンビニエンス メソッドが含まれています。
再開可能なメディアのアップロード プロトコルは、Google Drive API ドキュメントに記載されている再開可能なメディアのアップロード プロトコルに似ています。
プロトコル設計
次のシーケンス図に、再開可能なメディア アップロード プロトコルの仕組みを示します。
実装の詳細
関心のある主要なクラスは、MediaHttpUploader と MediaHttpProgressListener です。
サービス固有の生成ライブラリのメソッドにディスカバリ ドキュメントの mediaUpload
パラメータが含まれている場合、それらのメソッドに InputStreamContent をパラメータとして受け取るコンビニエンス メソッドが作成されます。(Google API Discovery Service を使用してメディア アップロードを行う方法については、メディア アップロードをご覧ください)。
たとえば、Drive API の insert
メソッドは mediaUpload
をサポートしており、次のコードを使用してファイルをアップロードできます。
class CustomProgressListener implements MediaHttpUploaderProgressListener { public void progressChanged(MediaHttpUploader uploader) throws IOException { switch (uploader.getUploadState()) { case INITIATION_STARTED: System.out.println("Initiation has started!"); break; case INITIATION_COMPLETE: System.out.println("Initiation is complete!"); break; case MEDIA_IN_PROGRESS: System.out.println(uploader.getProgress()); break; case MEDIA_COMPLETE: System.out.println("Upload is complete!"); } } } File mediaFile = new File("/tmp/driveFile.jpg"); InputStreamContent mediaContent = new InputStreamContent("image/jpeg", new BufferedInputStream(new FileInputStream(mediaFile))); mediaContent.setLength(mediaFile.length()); Drive.Files.Insert request = drive.files().insert(fileMetadata, mediaContent); request.getMediaHttpUploader().setProgressListener(new CustomProgressListener()); request.execute();
サービス固有の生成ライブラリなしで、再開可能なメディアのアップロード機能を使用することもできます。次に例を示します。
File mediaFile = new File("/tmp/Test.jpg"); InputStreamContent mediaContent = new InputStreamContent("image/jpeg", new BufferedInputStream(new FileInputStream(mediaFile))); mediaContent.setLength(mediaFile.length());MediaHttpUploader uploader = new MediaHttpUploader(mediaContent, transport, httpRequestInitializer); uploader.setProgressListener(new CustomProgressListener()); HttpResponse response = uploader.upload(requestUrl); if (!response.isSuccessStatusCode()) { throw GoogleJsonResponseException(jsonFactory, response); }
メディアを直接アップロード
再開可能なメディアのアップロードはデフォルトで有効になっていますが、無効にして、代わりに直接メディアのアップロードを使用できます(小さなファイルをアップロードする場合など)。Java 用 Google API クライアント ライブラリの 1.9.0-beta でメディアを直接アップロードできるようになりました。
再開可能なメディア アップロード プロトコルでは複数のリクエストでファイルをアップロードしますが、直接メディア アップロードでは 1 つの HTTP リクエストでファイル全体をアップロードします。直接アップロードを行うと、HTTP リクエストの数が減りますが、大容量のアップロードで発生しうる障害(接続エラーなど)が増加します。
直接メディア アップロードの使用は、上記の再開可能なメディア アップロードの説明と同じですが、次の呼び出しによって MediaHttpUploader が直接アップロードのみを行うよう指示されます。
mediaHttpUploader.setDirectUploadEnabled(true);