本頁說明如何在 Cloud Storage JSON 和 XML API 中發出可續傳的上傳要求。如因通訊問題導致資料傳輸過程遭到中斷,之後可透過此通訊協定繼續執行上傳作業。
如要瞭解如何在 Google Cloud CLI 和用戶端程式庫中使用可續傳上傳功能,請參閱「工具和 API 如何使用可續傳上傳功能」。
必要的角色
如要取得執行可續傳上傳作業所需的權限,請要求管理員授予您下列其中一個角色:
- 如要上傳的內容包含物件保留鎖定,請要求管理員授予您 bucket 的 Storage 物件管理員 ( - roles/storage.objectAdmin) IAM 角色。
- 在其他情況下,請要求管理員授予您值區的「儲存空間物件使用者」( - roles/storage.objectUser) IAM 角色。
這些預先定義的角色具備將物件上傳至各自案例的 Bucket 所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:
所需權限
- storage.objects.create
- storage.objects.delete
- 只有在上傳作業會覆寫現有物件時,才需要這項權限。
- storage.objects.setRetention- 只有在上傳內容包含物件保留鎖定時,才需要這項權限。
 
如要瞭解如何授予值區角色,請參閱「設定及管理值區的 IAM 政策」。
啟動可續傳的上傳工作階段
如要啟動可續傳的上傳工作階段,請按照下列步驟操作:
JSON API
- 安裝並初始化 gcloud CLI,以便為 - Authorization標頭產生存取權杖。
- (選用) 建立 JSON 檔案,其中包含要為上傳物件設定的 中繼資料。舉例來說,下列 JSON 檔案會設定要上傳至 - image/png的物件- contentType中繼資料:- { "contentType": "image/png" }
- 使用 - cURL透過- POST物件要求呼叫 JSON API:- curl -i -X POST --data-binary @METADATA_LOCATION \ -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Type: application/json" \ -H "Content-Length: INITIAL_REQUEST_LENGTH" \ "https://storage.googleapis.com/upload/storage/v1/b/BUCKET_NAME/o?uploadType=resumable&name=OBJECT_NAME"- 其中: - METADATA_LOCATION是 JSON 檔案的本機路徑,其中包含您在上一個步驟中指定的選用中繼資料。如果未納入中繼資料檔案,請排除這項檔案,以及- --data-binary @和- Content-Type標頭。
- INITIAL_REQUEST_LENGTH是這項初始要求主體中的位元組數,例如- 79。
- BUCKET_NAME是您要向其上傳物件的值區名稱。例如:- my-bucket。
- OBJECT_NAME是您要給予物件的網址編碼名稱。例如- pets/dog.png,網址編碼為- pets%2Fdog.png。如果您在步驟 2 的物件中繼資料檔案中加入- name,則不需要執行這項操作。
 - 如果您已啟用跨來源資源共用,也應在這次和後續的上傳要求中加入 - Origin標頭。- 您可以新增至要求的選用標頭包括 - X-Upload-Content-Type和- X-Upload-Content-Length。- 如果成功,回應會包含 - 200狀態碼,且類似下列內容:- HTTP/2 200 content-type: text/plain; charset=utf-8 x-guploader-uploadid: ABgVH8_jqDHM_KOvNAJCx73r9v5fINktk9U-pXana1szCM5803tlJ7CKsRbDxkyYCrfEiNqzcZ6B7DfoDtc-bdzpH-SpVTAMEO9EQV34qG0-0yk location: https://storage.googleapis.com/upload/storage/v1/b/my-bucket/o?uploadType=resumable&name=cat-pic.jpeg&upload_id=ABgVH8_jqDHM_KOvNAJCx73r9v5fINktk9U-pXana1szCM5803tlJ7CKsRbDxkyYCrfEiNqzcZ6B7DfoDtc-bdzpH-SpVTAMEO9EQV34qG0-0yk date: Mon, 07 Jul 2025 14:57:21 GMT vary: Origin vary: X-Origin cache-control: no-cache, no-store, max-age=0, must-revalidate expires: Mon, 01 Jan 1990 00:00:00 GMT pragma: no-cache content-length: 0 server: UploadServer alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 
- 儲存  標頭中提供的可續傳工作階段 URI,這是對  物件要求的回應。 - location- POST- 後續要求會使用這個 URI 上傳物件資料。 
XML API
- 安裝並初始化 gcloud CLI,以便為 - Authorization標頭產生存取權杖。
- 使用 - cURL透過空白主體要求呼叫 XML API:- POST物件- curl -i -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \ -H "Content-Length: 0" \ -H "Content-Type: OBJECT_CONTENT_TYPE" \ -H "x-goog-resumable: start" \ "https://storage.googleapis.com/BUCKET_NAME/OBJECT_NAME"- 其中: - OBJECT_CONTENT_TYPE是物件的內容類型。例如- image/png。如果未指定內容類型,Cloud Storage 系統會將物件的- Content-Type中繼資料設為- application/octet-stream。
- BUCKET_NAME是您要向其上傳物件的值區名稱。例如:- my-bucket。
- OBJECT_NAME是您要給予物件的網址編碼名稱。例如- pets/dog.png,網址編碼為- pets%2Fdog.png。
 - 如果您已啟用跨來源資源共用,也應在這次和後續的上傳要求中加入 - Origin標頭。- 如果成功,回應會包含 - 201狀態訊息。
- 儲存 - POST物件要求回應的- location標頭中提供的可續傳工作階段 URI。- 後續要求會使用這個 URI 上傳物件資料。 
上傳資料
啟動可續傳的上傳作業後,有兩種方式可以上傳物件資料:
- 單一區塊:這種做法通常是最佳選擇,因為需要的請求較少,因此效能較佳。
- 分成多個區塊:如果需要減少單一要求中傳輸的資料量,例如個別要求有固定時間限制,或上傳開始時不知道上傳總大小,請使用這個方法。
單一區塊上傳
如要以單一區塊上傳資料,請執行下列操作:
JSON API
- 使用 - cURL透過- PUT物件要求呼叫 JSON API:- curl -i -X PUT --data-binary @OBJECT_LOCATION \ -H "Content-Length: OBJECT_SIZE" \ "SESSION_URI"- 其中: - OBJECT_LOCATION是物件的本機路徑。例如:- Desktop/dog.png。
- OBJECT_SIZE是物件中的位元組數。例如:- 20000000。
- SESSION_URI是您啟動可續傳上傳作業時,- location標頭中傳回的值。
 - 您可以視需要加入以 - X-Goog-Meta-為前置字元的標頭,在要求中為物件新增自訂中繼資料。
XML API
如果上傳作業完全完成,您會收到 200 OK 或 201 Created 回應,以及與資源相關聯的所有中繼資料。
如果上傳要求中斷,或是收到 5xx 回應,請按照「繼續執行中斷的上傳作業」一節所述的程序進行。
上傳多個區塊
如要以多個區塊上傳資料,請按照下列步驟操作:
JSON API
- 從要上傳的整體資料建立資料區塊。 - 區塊大小應為 256 KiB (256 x 1024 位元組) 的倍數,但會完成上傳作業的最後一個區塊除外。通常來說,區塊越大,上傳速度就越快,但請注意,速度和記憶體用量之間會有所取捨。建議至少使用 8 MiB 做為區塊大小。 
- 使用 - cURL透過- PUT物件要求呼叫 JSON API:- curl -i -X PUT --data-binary @CHUNK_LOCATION \ -H "Content-Length: CHUNK_SIZE" \ -H "Content-Range: bytes CHUNK_FIRST_BYTE-CHUNK_LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"- 其中: - CHUNK_LOCATION是目前上傳的區塊本機路徑。
- CHUNK_SIZE是您在目前要求中上傳的位元組數。例如:- 8388608。
- CHUNK_FIRST_BYTE是您要上傳的區塊在整個物件中的起始位元組。
- CHUNK_LAST_BYTE是您要上傳的區塊在整個物件中的結尾位元組。
- TOTAL_OBJECT_SIZE是您要上傳的物件總大小。如果您不知道物件的完整大小,請使用- *做為這個值。
- SESSION_URI是您啟動可續傳上傳作業時,- Location標頭中傳回的值。
 - 例如 - Content-Range是- Content-Range: bytes 0-8388607/20000000。如要進一步瞭解這個標頭,請參閱- Content-Range。- 如果要求成功,伺服器會傳回 - 308 Resume Incomplete。回應包含- Range標頭。
- 針對要上傳的每個剩餘資料區塊,重複上述步驟,並使用每個回應的 - Range標頭中包含的上限值,決定每個後續區塊的開始位置;請勿假設伺服器已收到任何指定要求中傳送的所有位元組。- 您也可以在可續傳上傳作業的最終要求中,加入以 - X-Goog-Meta-為前置字元標頭,為物件新增自訂中繼資料。
XML API
- 從要上傳的整體資料建立資料區塊。 - 區塊大小應為 256 KiB (256 x 1024 位元組) 的倍數,但會完成上傳作業的最後一個區塊除外。通常來說,區塊越大,上傳速度就越快,但請注意,速度和記憶體用量之間會有所取捨。建議至少使用 8 MiB 做為區塊大小。 
- 使用 - cURL透過- PUT物件要求呼叫 XML API:- curl -i -X PUT --data-binary @CHUNK_LOCATION \ -H "Content-Length: CHUNK_SIZE" \ -H "Content-Range: bytes CHUNK_FIRST_BYTE-CHUNK_LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"- 其中: - CHUNK_LOCATION是目前上傳的區塊本機路徑。
- CHUNK_SIZE是您在目前要求中上傳的位元組數。例如:- 8388608。
- CHUNK_FIRST_BYTE是您要上傳的區塊在整個物件中的起始位元組。
- CHUNK_LAST_BYTE是您要上傳的區塊在整個物件中的結尾位元組。
- TOTAL_OBJECT_SIZE是您要上傳的物件總大小。如果您不知道物件的完整大小,請使用- *做為這個值。
- SESSION_URI是您啟動可續傳上傳作業時,- Location標頭中傳回的值。
 - 例如 - Content-Range是- Content-Range: bytes 0-8388607/20000000。如要進一步瞭解這個標頭,請參閱- Content-Range。- 如果要求成功,伺服器會傳回 - 308 Resume Incomplete。回應包含- Range標頭。
- 針對要上傳的每個剩餘資料區塊,重複上述步驟,並使用每個回應的 - Range標頭中包含的上限值,決定每個後續區塊的開始位置;請勿假設伺服器已收到任何指定要求中傳送的所有位元組。
上傳完成後,您會收到 200 OK 或 201 Created 回應,以及與資源相關聯的所有中繼資料。
如果任何區塊上傳作業中斷,或是收到 5xx 回應,您應重新傳送中斷的區塊,或從中斷處繼續上傳。
查看支援續傳的上傳作業狀態
如果可續傳的上傳作業中斷,或不確定上傳作業是否完成,可以檢查上傳狀態:
JSON API
XML API
如果收到 200 OK 或 201 Created 回應,表示上傳作業已完成,不需採取任何行動。
308 Resume Incomplete 回應表示您需要繼續上傳資料。
- 如果 Cloud Storage 尚未保存任何位元組,308回應就不會包含Range標頭。在這種情況下,您應從頭開始上傳。
- 否則,308回應會包含Range標頭,指出 Cloud Storage 目前已儲存哪些位元組。繼續上傳中斷的檔案時,請使用這個值。
繼續執行中斷的上傳作業
如果上傳要求在收到回應前就終止,或者您收到 503 或 500 回應,那麼就需要從中斷處繼續處理上傳作業。如要繼續處理中斷的上傳作業,請按照下列步驟操作:
JSON API
- 將狀態檢查回應中包含的 - Range標頭上限值儲存起來。如果回應沒有- Range標頭,表示 Cloud Storage 尚未保存任何位元組,您應從頭上傳。
- 請確認即將上傳的物件資料,是從 - Range標頭中上限值後方的位元組開始。
- 如果中斷的要求包含以 - X-Goog-Meta-為前置字元標頭,請在要求中加入這些標頭,以繼續上傳。
- 使用 - cURL透過- PUT物件要求呼叫 JSON API,該要求會從- Range標頭中值的下一個位元組開始擷取:- curl -i -X PUT --data-binary @PARTIAL_OBJECT_LOCATION \ -H "Content-Length: UPLOAD_SIZE_REMAINING" \ -H "Content-Range: bytes NEXT_BYTE-LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"- 其中: - PARTIAL_OBJECT_LOCATION是要上傳剩餘資料的本機路徑。
- UPLOAD_SIZE_REMAINING是您在目前要求中上傳的位元組數。舉例來說,如果物件總大小為 20000000,上傳 0 到 42 位元組後中斷,則上傳其餘部分時,- UPLOAD_SIZE_REMAINING會是- 19999957。
- NEXT_BYTE是您在步驟 2 中儲存的值之後的下一個整數。舉例來說,如果- 42是步驟 2 中的上限值,則- NEXT_BYTE的值為- 43。
- LAST_BYTE是這項- PUT要求中包含的結尾位元組。舉例來說,如要完成上傳總大小為- 20000000的物件,- LAST_BYTE的值為- 19999999。
- TOTAL_OBJECT_SIZE是您要上傳的物件總大小。例如,- 20000000。如果您不知道物件的完整大小,請使用- *做為這個值。
- SESSION_URI是您啟動可續傳上傳作業時,- Location標頭中傳回的值。
 
XML API
- 儲存狀態檢查回應中包含的 - Range標頭上限值。如果回應沒有- Range標頭,表示 Cloud Storage 尚未保存任何位元組,您應從頭上傳。
- 請確認即將上傳的物件資料,是從 - Range標頭中上限值後方的位元組開始。
- 使用 - cURL透過- PUT物件要求呼叫 XML API,並從- Range標頭中的值後方位元開始擷取資料:- curl -i -X PUT --data-binary @PARTIAL_OBJECT_LOCATION \ -H "Content-Length: UPLOAD_SIZE_REMAINING" \ -H "Content-Range: bytes NEXT_BYTE-LAST_BYTE/TOTAL_OBJECT_SIZE" \ "SESSION_URI"- 其中: - PARTIAL_OBJECT_LOCATION是要上傳剩餘資料的本機路徑。
- UPLOAD_SIZE_REMAINING是您在目前要求中上傳的位元組數。舉例來說,如果物件總大小為 20000000,上傳 0 到 42 位元組後中斷,則上傳其餘部分時,- UPLOAD_SIZE_REMAINING會是- 19999957。
- NEXT_BYTE是您在步驟 2 中儲存的值之後的下一個整數。舉例來說,如果- 42是步驟 2 中的上限值,則- NEXT_BYTE的值為- 43。
- LAST_BYTE是這項- PUT要求中包含的結尾位元組。舉例來說,如要完成上傳總大小為- 20000000的物件,- LAST_BYTE的值為- 19999999。
- TOTAL_OBJECT_SIZE是您要上傳的物件總大小。例如,- 20000000。如果您不知道物件的完整大小,請使用- *做為這個值。
- SESSION_URI是您啟動可續傳上傳作業時,- Location標頭中傳回的值。
 
只要工作階段 URI 仍有效,你就能視需要多次繼續上傳。工作階段 URI 會在一週後失效。資料上傳成功後,Cloud Storage 會以 200 OK 或 201 created 狀態碼回應。
取消上傳
如要取消未完成的續傳上傳作業,並防止對該作業採取任何進一步動作,請按照下列步驟操作:
JSON API
- 使用 - cURL透過- DELETE要求呼叫 JSON API:- curl -i -X DELETE -H "Content-Length: 0" \ "SESSION_URI" - 其中: - SESSION_URI是您啟動可續傳上傳作業時,- Location標頭中傳回的值。
 
如果成功,回應會包含 499 狀態碼。日後嘗試查詢或繼續上傳時,系統會傳回 4xx 回應。
XML API
- 使用 - cURL透過- DELETE要求呼叫 XML API:- curl -i -X DELETE -H "Content-Length: 0" \ "SESSION_URI" - 其中: - SESSION_URI是您啟動可續傳上傳作業時,- Location標頭中傳回的值。
 
如果成功,回應會包含 204 狀態碼,日後查詢或繼續上傳的嘗試也會產生 204 回應。
失敗處理
在極少數情況下,由於 bucket 的權限已變更,或最終上傳物件的完整性檢查偵測到不符,因此要求繼續上傳中斷的作業可能會失敗,並出現無法重試的「4xx」錯誤。如果發生這種情況,請啟動新的續傳上傳作業階段,然後重試上傳。
後續步驟
- 進一步瞭解支援續傳的上傳作業。
- 請參閱 JSON API 和 XML API 的總覽。
- 串流上傳大小不明的檔案。
- 批次處理對 Cloud Storage JSON API 的多項要求。