Object upload part

Uploads a part of a multipart upload. Returns an ETag which must be used when completing the multipart upload.

To ensure that data is not corrupted, you should specify a Content-MD5 header or a x-goog-hash header in the request so that Cloud Storage can check the uploaded data against the provided value.

Uploaded parts are not included in requests to list objects in the bucket, but uploaded parts are charged for storage and early deletion as if they were objects.

See Quotas & limits for limits associated with multipart uploads, including limits on part size and number of parts. For tips on uploading to Cloud Storage, see Best Practices.

Query string parameters

Parameter Description Required
partNumber Uniquely identifies the position of the part within the larger multipart upload. partNumber is an integer with a mimimum value of 1 and a maximum value of 10,000. Yes
uploadId Indicates the multipart upload that this part is associated with. Yes

See signed URL query string parameters for information on the parameters you include when creating and using signed URLs.

Request headers

In addition to common request headers, the following can be used.

Header Description Required
x-goog-hash An MD5 and/or CRC32C base64-encoded checksum of the part data. No

If you specified a customer-supplied encryption key in the request to initiate the multipart upload, you must use the same headers and values in each part upload.

Request body elements

The request body contains the data for the part being uploaded.

Request syntax

The following syntax applies to PUT Object requests that use the uploadId query string parameter.

Host: BUCKET_NAME.storage.googleapis.com
Date: DATE
Content-MD5: MD5_DIGEST
x-goog-hash: MD5_DIGEST

Response headers

Included in the response headers are x-goog-hash headers that specify the CRC32C and MD5 base64-encoded checksums of the uploaded part.

The response also includes an ETag header that must be used in the final request to complete the multipart upload.

Response body elements

The response does not include an XML document in the response body.


The following sample uploads the first part of an object named paris.jpg to a bucket named travel-maps.


PUT /paris.jpg?partNumber=1&uploadId=VXBsb2FkIElEIGZvciBlbHZpbmcncyBteS1tb3ZpZS5tMnRzIHVwbG9hZA HTTP/1.1
Host: travel-maps.storage.googleapis.com
Date: Wed, 31 Mar 2021 16:31:08 GMT
Content-Length: 100000000
Content-MD5: Ojk9c3dhfxgoKVVHYwFbHQ==
Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

***part data omitted***


HTTP/1.1 200 OK
Date:  Wed, 31 Mar 2021 20:34:56 GMT
ETag: "39a59594290b0f9a30662a56d695b71d"
Content-Length: 0
Server: UploadServer
x-goog-hash: crc32c=n03x6A==
x-goog-hash: md5=Ojk9c3dhfxgoKVVHYwFbHQ==

Common error codes

If the supplied MD5 digest is malformed, you get a 400 Bad Request status code and the body of the error response has InvalidDigest in the Code element.

If the digest does not match the digest we compute from the body, you get a 400 Bad Request status code and the body of the error response has BadDigest in the Code element.

If one of the parts specified in the request is more than 5 GiB, you get a 400 Bad Request status code and the body of the error response has EntityTooLarge in the Code element.

If the uploadId specified in the request is invalid or applies to a multipart upload that has already been completed or aborted, you get a 404 Not Found status code and the body of the error response has NoSuchUpload in the Code element.