執行支援續傳的上傳作業

總覽

本頁面說明如何在 Cloud Storage JSON 和 XML API 中,提出支援續傳的上傳作業要求。如因通訊問題導致資料傳輸過程遭到中斷,之後可透過此通訊協定繼續執行上傳作業。

如要瞭解如何在 Google Cloud CLI 和用戶端程式庫中使用支援續傳的上傳作業,請參閱「工具和 API 如何使用可續傳上傳功能」。

必要的角色

如要取得執行支援續傳的上傳作業所需的權限,請要求系統管理員授予下列任一角色:

  • 如要上傳包含物件保留鎖定的檔案,請要求管理員授予您 bucket 的 Storage 物件管理員 (roles/storage.objectAdmin) IAM 角色。

  • 在其他情況下,請要求管理員授予您 bucket 的 Storage 物件使用者 (roles/storage.objectUser) IAM 角色。

這些預先定義的角色具備將物件上傳至各自案件值區所需的權限。如要查看確切的必要權限,請展開「Required permissions」(必要權限) 部分:

所需權限

  • storage.objects.create
  • storage.objects.delete
    • 只有在上傳作業會覆寫現有物件時,才需要這項權限。
  • storage.objects.setRetention
    • 只有在上傳的內容包含物件保留鎖定時,才需要這項權限。

您也可以透過其他預先定義的角色或自訂角色取得這些權限。

如要瞭解如何授予 bucket 角色,請參閱「在 bucket 上設定及管理 IAM 政策」。

啟動支援續傳的上傳作業工作階段

如要啟動支援續傳的上傳作業工作階段,請按照下列步驟操作:

JSON API

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. (選用) 建立 JSON 檔案,內含要上傳物件的中繼資料。舉例來說,下列 JSON 檔案會將要上傳的物件 contentType 中繼資料設為 image/png:

    {
        "contentType": "image/png"
    }
  3. 使用 cURL 呼叫 JSON API,並傳送 POST 物件要求:

    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.s3nsapis.fr/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 是要上傳物件的 bucket 名稱。例如: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
  4. 儲存續傳工作階段 URI,該 URI 位於 POST 物件要求回應的 location 標頭中。

    這個 URI 會用於後續要求,以上傳物件資料。

XML API

  1. 安裝並初始化 gcloud CLI,以便為 Authorization 標頭產生存取權杖。

  2. 使用 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.s3nsapis.fr/BUCKET_NAME/OBJECT_NAME"

    其中:

    • OBJECT_CONTENT_TYPE 是物件的內容類型。例如:image/png。如未指定內容類型,Cloud Storage 系統會將物件的 Content-Type 中繼資料設為 application/octet-stream。
    • BUCKET_NAME 是您要上傳物件的 bucket 名稱。例如:my-bucket。
    • OBJECT_NAME 是要為物件指定的網址編碼名稱。例如 pets/dog.png,網址編碼為 pets%2Fdog.png。

    如果您已啟用跨源資源共用,也應在這次和後續的上傳要求中加入 Origin 標頭。

    如果成功,回應會包含 201 狀態訊息。

  3. 儲存續傳工作階段 URI,該 URI 位於 POST 物件要求回應的 location 標頭中。

    這個 URI 會用於後續要求,以上傳物件資料。

上傳資料

啟動支援續傳的上傳作業後,您可以透過兩種方式上傳物件資料:

  • 單一區塊:這種做法通常是最佳選擇,因為需要的請求較少,因此效能較佳。
  • 分成多個區塊:如果需要減少單一要求中傳輸的資料量,例如個別要求有固定時間限制,或上傳開始時不知道上傳總大小,請使用這種方法。

單一區塊上傳

如要以單一區塊上傳資料,請按照下列步驟操作:

JSON API

  1. 使用 cURL 呼叫 JSON API,並發出 PUT 物件要求:

    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

  1. 使用 cURL 呼叫 XML API,並傳送 PUT 物件要求:

    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 標頭中傳回的值。

如果上傳作業完全完成,您會收到 200 OK 或 201 Created 回應,以及與資源相關聯的所有中繼資料。

如果上傳要求中斷,或是收到 5xx 回應,請按照「繼續執行中斷的上傳作業」一節所述的程序進行。

上傳多個區塊

如要分批上傳資料,請按照下列步驟操作:

JSON API

  1. 從要上傳的整體資料建立資料區塊。

    區塊大小應為 256 KiB (256 x 1024 位元組) 的倍數,除非是完成上傳作業的最後一個區塊。通常來說,區塊越大,上傳速度就越快,但請注意,速度和記憶體用量之間會有所取捨。建議區塊大小至少為 8 MiB。

  2. 使用 cURL 呼叫 JSON API,並發出 PUT 物件要求:

    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 標頭。

  3. 針對要上傳的每個剩餘資料區塊重複上述步驟,並使用每個回應的 Range 標頭中包含的上限值,決定每個後續區塊的起始位置。請勿假設伺服器收到任何指定要求中傳送的所有位元組。

    您可以在支援續傳的上傳作業的最終要求中,視需要加入以 X-Goog-Meta- 為前置字元標頭,為物件新增自訂中繼資料。

XML API

  1. 從要上傳的整體資料建立資料區塊。

    區塊大小應為 256 KiB (256 x 1024 位元組) 的倍數,除非是完成上傳作業的最後一個區塊。區塊越大,上傳速度通常越快,但請注意,速度和記憶體用量之間需要權衡。建議區塊大小至少為 8 MiB。

  2. 使用 cURL 呼叫 XML API,並傳送 PUT 物件要求:

    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 標頭。

  3. 針對要上傳的其餘資料區塊,重複上述步驟,並使用每個回應的 Range 標頭中包含的上限值,決定每個後續區塊的起始位置。請勿假設伺服器收到任何指定要求中傳送的所有位元組。

上傳完成後,您會收到 200 OK 或 201 Created 回應,以及與資源相關聯的所有中繼資料。

如果任何區塊上傳作業中斷,或收到 5xx 回應,請重新傳送整個中斷的區塊,或從中斷處繼續上傳。

查看支援續傳的上傳作業狀態

如果支援續傳的上傳作業中斷,或不確定上傳作業是否完成,可以檢查上傳狀態:

JSON API

  1. 使用 cURL 呼叫 JSON API,並傳送 PUT 物件要求:

    curl -i -X PUT \
        -H "Content-Length: 0" \
        -H "Content-Range: bytes */OBJECT_SIZE" \
        "SESSION_URI"

    其中:

    • OBJECT_SIZE 是物件中的位元組總數。如果不知道物件的完整大小,請將這個值設為 *。
    • SESSION_URI 是您啟動支援續傳的上傳作業時,Location 標頭中傳回的值。

XML API

  1. 使用 cURL 透過 PUT 物件要求呼叫 XML API:

    curl -i -X PUT \
        -H "Content-Length: 0" \
        -H "Content-Range: bytes */OBJECT_SIZE" \
        "SESSION_URI"

    其中:

    • OBJECT_SIZE 是物件中的位元組總數。如果不知道物件完整大小,請使用 * 做為這個值。
    • SESSION_URI 是您啟動支援續傳的上傳作業時,Location 標頭中傳回的值。

200 OK 或 201 Created 回應表示上傳作業已完成,不需採取進一步行動。

308 Resume Incomplete 回應表示您需要繼續上傳資料。

  • 如果 Cloud Storage 尚未保存任何位元組,308 回應就不會含有 Range 標頭。在這種情況下,您應該從頭開始上傳。
  • 否則,308 回應會包含 Range 標頭,指定 Cloud Storage 目前已保留哪些位元組。繼續中斷的上傳作業時,請使用這個值。

繼續執行中斷的上傳作業

如果上傳要求在收到回應前就終止,或者您收到 503 或 500 回應,那麼就需要從中斷處繼續處理上傳作業。如要繼續處理中斷的上傳作業,請按照下列步驟操作:

JSON API

  1. 查看支援續傳的上傳作業狀態。

  2. 儲存狀態檢查回應中 Range 標頭的最大值。如果回應沒有 Range 標頭,表示 Cloud Storage 尚未保留任何位元組,您應從頭開始上傳。

  3. 請確認您要上傳的物件資料,是從 Range 標頭中上限值後方的位元組開始。

  4. 如果中斷的要求包含前置字串為 X-Goog-Meta- 的標頭,請在要求中加入這些標頭,以便繼續上傳。

  5. 使用 cURL 呼叫 JSON API,並傳送 PUT 物件要求,從 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

  1. 查看支援續傳的上傳作業狀態。

  2. 儲存狀態檢查回應中 Range 標頭的最大值。如果回應沒有 Range 標頭,表示 Cloud Storage 尚未保存任何位元組,您應從頭上傳。

  3. 請確認即將上傳的物件資料,是從 Range 標頭中上限值後方的位元組開始。

  4. 使用 cURL 呼叫 XML API,並使用 PUT Object 要求,在 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

  1. 使用 cURL 呼叫 JSON API,並傳送 DELETE 要求:

    curl -i -X DELETE -H "Content-Length: 0" \
      "SESSION_URI"

    其中:

如果成功,回應會包含 499 狀態碼。日後嘗試查詢或繼續上傳時,會收到 4xx 回應。

XML API

  1. 使用 cURL 呼叫 XML API,並傳送 DELETE 要求:

    curl -i -X DELETE -H "Content-Length: 0" \
      "SESSION_URI"

    其中:

如果成功,回應會包含 204 狀態碼,日後嘗試查詢或繼續上傳作業時,也會收到 204 回應。

失敗處理機制

在極少數情況下,如果 bucket 權限有所變更,或最終上傳物件的完整性檢查偵測到不相符,則繼續中斷上傳的要求可能會失敗,並顯示無法重試的「4xx」錯誤。如果發生這種情況,請啟動新的支援續傳的上傳作業工作階段,重新嘗試上傳。

後續步驟