直接和續傳的媒體上傳

本文件說明如何透過 Java 適用的 Google API 用戶端程式庫使用直接及重新啟用的媒體上傳功能。

支援續傳的媒體上傳

將大型媒體檔案上傳到伺服器時,請使用支援續傳的媒體上傳功能,以區塊傳送檔案區塊。Google API 產生的程式庫包含便利的方法來與可續傳的媒體上傳互動。

支援續傳的媒體上傳通訊協定與 Google Drive API 說明文件中所述的可恢復媒體上傳通訊協定類似。

通訊協定設計

以下序列圖展示可繼續媒體上傳通訊協定的運作方式:
序列和回應在用戶端與伺服器之間移動的流程圖。

實作詳情

感興趣的主要類別為 MediaHttpUploaderMediaHttpProgressListener

如果服務專屬程式庫中的方法包含探索文件中的 mediaUpload 參數,則系統會建立使用 InputStreamContent 做為參數的便利方法。如要進一步瞭解如何將媒體上傳與 Google API 探索服務搭配使用,請參閱媒體上傳一文。)

例如,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 版本中推出。

直接媒體上傳會透過單一 HTTP 要求上傳整個檔案,而非可繼續的媒體上傳通訊協定,後者以多個要求上傳檔案。直接上傳會減少 HTTP 要求的數量,但可能會降低發生大型上傳作業的失敗機率 (例如連線失敗)。

直接媒體上傳作業的用量與上述可繼續媒體上傳作業的用量相同,並呼叫下列指示 MediaHttpUploader 只直接上傳:

mediaHttpUploader.setDirectUploadEnabled(true);