支援續傳的上傳作業

本頁說明如何向 Google Photos Library API 提出支援續傳的上傳要求 宣告內容如因通訊問題導致資料傳輸過程遭到中斷,之後可透過此通訊協定繼續執行上傳作業。

如果您符合下列任一情況,請使用支援續傳的上傳選項:

  • 你正在上傳大型檔案。
  • 網路中斷或其他傳輸錯誤的可能性為 高 (例如您從行動應用程式上傳檔案)。

發生網路問題時,可續傳上傳功能也可以減少頻寬用量,因為您不需要從頭開始上傳大型檔案。

步驟 1:啟動上傳工作階段

請向 https://photoslibrary.googleapis.com/v1/uploads 傳送 POST 要求,啟動可續傳的上傳工作階段。使用支援續傳的上傳作業 請在此要求中傳回網址,然後上傳檔案。

POST 要求必須包含下列標頭:

標頭欄位
Content-Length 由於要求主體為空白,請將其設為 0
X-Goog-Upload-Command 請設為 start
X-Goog-Upload-Content-Type 設為檔案的 mime 類型,例如 image/jpeg
X-Goog-Upload-Protocol 請設為 resumable
X-Goog-Upload-Raw-Size 設定為檔案資料的位元組總數 已轉移。

以下是 POST 要求標頭:

POST https://photoslibrary.googleapis.com/v1/uploads
Authorization: Bearer oauth2-token
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: mime-type
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: bytes-of-file

步驟 2:儲存工作階段網址

如果成功,POST 要求會傳回 200 OK HTTP 狀態碼,包括 。

X-Goog-Upload-URL: url-to-make-uploads-to
X-Goog-Upload-Chunk-Granularity: chunk-granularity-in-bytes

標頭欄位 x-goog-upload-chunk-granularity 包含用戶端傳送的所有資料區塊的位元組對齊和大小精細度。如果上傳 所有上傳作業都會以多個區塊執行,除了上次上傳,所有上傳作業外。 必須採用這個值的倍數也就是上傳檔案的位元組 必須對齊這個值。在最後一小段中,您可以上傳剩餘的位元組。

標頭欄位 X-Goog-Upload-URL 包含不重複的網址,必須透過所有剩餘要求才能完成上傳。請複製並儲存這個可續傳的工作階段網址,以便在後續的要求中使用。

步驟 3:上傳檔案

有兩種方式可以上傳檔案包含支援續傳的工作階段:

  1. 在單一要求中這種做法通常是最佳做法,因為它需要較少的要求,因此效能較佳。
  2. 分成多個片段。在這種方法中,上傳作業會透過分割資料,以多個要求進行。資料會以 x-goog-upload-chunk-granularity 的倍數分割。如有必要,可以重試分割要求。

    如果符合以下描述,請使用這個方法:

    • 您需要減少任一單一 請求。如果在報表設有固定時間限制的情況下 個別要求
    • 您需要提供自訂指標來表示上傳內容 進度。
    • 您必須知道何時可以安全捨棄資料。

單一請求

如何透過單一要求上傳檔案:

  1. 建立 POST 要求至可續傳的工作階段網址。
  2. 將檔案資料新增至要求主體。
  3. 新增下列 HTTP 標頭:

    • Content-Length:設為 檔案。
    • X-Goog-Upload-Command:設為 upload, finalize
  4. 傳送要求。

如果上傳要求中斷,或是你收到 5xx 請按照恢復 中斷上傳

如果要求成功,您會在回應主體中收到 200 OK HTTP 狀態碼和上傳符記。建立 使用這個上傳憑證建立媒體項目

多個區塊

如何分塊上傳檔案:

  1. 請對可續傳工作階段網址建立 POST 要求。
  2. 將區塊的資料新增至要求主體。

    除了完成上傳作業的最後一個區塊,其他區塊的大小都必須是可接受的區塊大小的倍數。保留 區塊的區塊越大,上傳效率越好

  3. 新增下列 HTTP 標頭:

    • Content-Length:設為 區塊
    • X-Goog-Upload-Command:設為 upload。針對最後一個區塊,請設為 upload, finalize
    • X-Goog-Upload-Offset:設為應寫入位元組的偏移量。請注意,您必須上傳位元組 依序執行第一個偏移量是 0
  4. 傳送要求。

    如果上傳要求中斷,或是你收到 5xx 請按照恢復 中斷上傳

  5. 針對檔案中剩餘的每個區塊重複執行這些步驟。

如果要求成功,您會在回應主體中收到 200 OK HTTP 狀態碼和上傳符記。建立 使用這個上傳憑證建立媒體項目

範例

單一請求

以下範例顯示可續傳要求,可在單一要求中上傳 3,039,417 位元組的 JPEG 檔案。

POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: image/jpeg
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: 3039417
[no body]

回應會包含上傳網址和預期的區塊大小:

HTTP/1.1 200 OK
X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable
X-Goog-Upload-Chunk-Granularity: 262144

最終上傳要求:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 3039417
X-Goog-Upload-Command: upload, finalize
X-Goog-Upload-Offset: 0

[BYTES 0-4199999]

多個區塊

以下範例說明透過可續傳的要求 3,039,417 位元組 JPEG 檔案,分成多個區塊,透過可續傳工作階段 取得的網址和可接受的區塊大小精細程度。 這個範例使用 262,144 位元組的區塊大小,這是在初始化上傳工作階段時,在標頭欄位 x-goog-upload-chunk-granularity 中傳回的值。請注意,每次上傳都包含的位元組 是 262,144 的倍數

初始化上傳工作階段,接收上傳網址和區塊大小 如前一步驟所述:

POST https://photoslibrary.googleapis.com/v1/uploads HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: start
X-Goog-Upload-Content-Type: image/jpeg
X-Goog-Upload-Protocol: resumable
X-Goog-Upload-Raw-Size: 3039417
[no body]

回應包含上傳網址和預期的區塊大小:

HTTP/1.1 200 OK
X-Goog-Upload-URL: https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable
X-Goog-Upload-Chunk-Granularity: 262144

第一個區塊:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 1048576
X-Goog-Upload-Command: upload
X-Goog-Upload-Offset: 0

[BYTES 0-1048575]

第二個區塊:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 1048576
X-Goog-Upload-Command: upload
X-Goog-Upload-Offset: 1048576

[BYTES 1048576-2097151]

最後區塊:

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 942265
X-Goog-Upload-Command: upload, finalize
X-Goog-Upload-Offset: 2097152

[BYTES 2097152-4200000]

繼續中斷的上傳作業

如果上傳要求中斷,或是您收到非 200 HTTP 狀態碼,請查詢伺服器,找出上傳成功的資料量。

以下是可續傳工作階段網址的 POST 要求。X-Goog-Upload-Command 應設為 query

POST https://photoslibrary.googleapis.com/v1/uploads?upload_id=AEnB2Urq&upload_protocol=resumable HTTP/1.1
Content-Length: 0
X-Goog-Upload-Command: query

伺服器的回應包含 200 OK HTTP 狀態碼,以及 目前的上傳大小

HTTP/1.1 200 OK
X-Goog-Upload-Status: active
X-Goog-Upload-Size-Received: 100

然後,您可以從這個偏移處繼續上傳。除非您傳送了合併的上傳和完成指令,否則必須從伺服器提供的位移處繼續上傳,在這種情況下,您也可以從位移 0 處繼續上傳。

如果查詢指令的 HTTP 回應中出現 X-Goog-Upload-Status 標頭,且值並非 active,表示上傳作業已終止。