直接和續傳的媒體上傳作業

本文說明如何透過適用於 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);