Use a PUT object request to:

- [Upload an Object](https://docs.cloud.google.com/storage/docs/xml-api/put-object-upload.md.txt)
- [Upload an Object Part](https://docs.cloud.google.com/storage/docs/xml-api/put-object-multipart.md.txt)
- [Copy an Object](https://docs.cloud.google.com/storage/docs/xml-api/put-object-copy.md.txt)
- [Compose an Object](https://docs.cloud.google.com/storage/docs/xml-api/put-object-compose.md.txt)
- [Set Object ACLs](https://docs.cloud.google.com/storage/docs/xml-api/put-object-acls.md.txt)
- [Set Object Retention](https://docs.cloud.google.com/storage/docs/xml-api/put-object-retention.md.txt)

## Common request headers

The following are common request headers for PUT object requests.

| Header | Description | Required |
|---|---|---|
| `Authorization` | The authentication string for the request. | Yes |
| `Content-Length` | The length of the request body without headers (in bytes). | Yes^1^ |
| `Content-Type`^2^ | The MIME type of the request body. If you do not specify a content type, Cloud Storage defaults to [`application/octet-stream`](https://datatracker.ietf.org/doc/html/rfc2046#section-4.5.1) when it serves the object. | No (recommended) |
| `Content-MD5` | The MD5 digest of the request message without headers. While not required, this header is generally recommended as a data integrity check to verify that the data received by Cloud Storage is the same as the data that was intended to be sent. | No |
| `Date` | The date and time of the request. | Yes |
| `Host` | The URI for Cloud Storage. For more information, see [Request Endpoints](https://docs.cloud.google.com/storage/docs/request-endpoints.md.txt). | Yes |
| `Transfer-Encoding` | Indicates if the message body was chunked. In requests that use [V4 Signatures](https://docs.cloud.google.com/storage/docs/authentication/signatures.md.txt) for their authentication, chunked uploads must also include the header `x-amz-decoded-content-length`. | No (except for requests that use chunked transfer encoding) |
| `x-goog-if-generation-match`^2^ | If the generation you specify is the same as the object you're replacing, then the object is replaced. You can also specify 0 as a special value to indicate that the new object is only created if there is no existing object. | No |
| `x-goog-if-metageneration-match`^2^ | If the metageneration you specify is the same as the object you're trying to update, then the object metadata is updated. This is only allowed if `x-goog-if-generation` is specified. By combining these two generation properties, you can implement safe read-modify-write updates. | No |
| `x-goog-storage-class`^2^ | Gives an object a storage class besides the default storage class of the associated bucket. | No |
| `x-goog-user-project` | The project to be billed for charges associated with the request. | No |

^1^ Not required for requests that use chunked transfer encoding.

^2^ This header is not applicable in `PUT Object` requests that
[upload an object part](https://docs.cloud.google.com/storage/docs/xml-api/put-object-multipart.md.txt).