直接再開可能なメディア アップロード

このドキュメントでは、Java 用 Google API クライアント ライブラリで直接アップロードと再開可能なメディアをアップロードする方法について説明します。

再開可能なメディアのアップロード

大きなメディア ファイルをサーバーにアップロードするときは、再開可能なメディアのアップロードを使用して、チャンクごとにファイル チャンクを送信します。Google API が生成したライブラリには、再開可能なメディア アップロードを操作するためのコンビニエンス メソッドが含まれています。

再開可能なメディアのアップロード プロトコルは、Google Drive API ドキュメントに記載されている再開可能なメディアのアップロード プロトコルに似ています。

プロトコル設計

次のシーケンス図に、再開可能なメディア アップロード プロトコルの仕組みを示します。
クライアントとサーバー間のリクエストとレスポンスの移動方法を示すシーケンス図。

実装の詳細

関心のある主要なクラスは、MediaHttpUploaderMediaHttpProgressListener です。

サービス固有の生成ライブラリのメソッドにディスカバリ ドキュメントmediaUpload パラメータが含まれている場合、それらのメソッドに InputStreamContent をパラメータとして受け取るコンビニエンス メソッドが作成されます。(Google API Discovery Service を使用してメディア アップロードを行う方法については、メディア アップロードをご覧ください)。

たとえば、Drive APIinsert メソッドは 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);