copyObject method
- required String bucket,
- required String copySource,
- required String key,
- ObjectCannedACL? acl,
- bool? bucketKeyEnabled,
- String? cacheControl,
- ChecksumAlgorithm? checksumAlgorithm,
- String? contentDisposition,
- String? contentEncoding,
- String? contentLanguage,
- String? contentType,
- String? copySourceIfMatch,
- DateTime? copySourceIfModifiedSince,
- String? copySourceIfNoneMatch,
- DateTime? copySourceIfUnmodifiedSince,
- String? copySourceSSECustomerAlgorithm,
- String? copySourceSSECustomerKey,
- String? copySourceSSECustomerKeyMD5,
- String? expectedBucketOwner,
- String? expectedSourceBucketOwner,
- String? expires,
- String? grantFullControl,
- String? grantRead,
- String? grantReadACP,
- String? grantWriteACP,
- String? ifMatch,
- String? ifNoneMatch,
- Map<
String, String> ? metadata, - MetadataDirective? metadataDirective,
- ObjectLockLegalHoldStatus? objectLockLegalHoldStatus,
- ObjectLockMode? objectLockMode,
- DateTime? objectLockRetainUntilDate,
- RequestPayer? requestPayer,
- String? sSECustomerAlgorithm,
- String? sSECustomerKey,
- String? sSECustomerKeyMD5,
- String? sSEKMSEncryptionContext,
- String? sSEKMSKeyId,
- ServerSideEncryption? serverSideEncryption,
- StorageClass? storageClass,
- String? tagging,
- TaggingDirective? taggingDirective,
- String? websiteRedirectLocation,
Creates a copy of an object that is already stored in Amazon S3.
This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo). You can copy individual objects between general purpose buckets, between directory buckets, and between general purpose buckets and directory buckets.
- Amazon S3 supports copy operations using Multi-Region Access Points only as a destination when using the Multi-Region Access Point ARN.
-
Directory buckets - For directory buckets, you must make requests
for this API operation to the Zonal endpoint. These endpoints support
virtual-hosted-style requests in the format
https://amzn-s3-demo-bucket.s3express-zone-id.region-code.amazonaws.com/key-name. Path-style requests are not supported. For more information about endpoints in Availability Zones, see Regional and Zonal endpoints for directory buckets in Availability Zones in the Amazon S3 User Guide. For more information about endpoints in Local Zones, see Concepts for directory buckets in Local Zones in the Amazon S3 User Guide. - VPC endpoints don't support cross-Region requests (including copies). If you're using VPC endpoints, your source and destination buckets should be in the same Amazon Web Services Region as your VPC endpoint.
- Authentication and authorization
-
All
CopyObjectrequests must be authenticated and signed by using IAM credentials (access key ID and secret access key for the IAM identities). All headers with thex-amz-prefix, includingx-amz-copy-source, must be signed. For more information, see REST Authentication.Directory buckets - You must use the IAM credentials to authenticate and authorize your access to the
CopyObjectAPI operation, instead of using the temporary security credentials through theCreateSessionAPI operation.Amazon Web Services CLI or SDKs handles authentication and authorization on your behalf.
- Permissions
-
You must have read access to the source object and write
access to the destination bucket.
-
General purpose bucket permissions - You must have permissions in
an IAM policy based on the source and destination bucket types in a
CopyObjectoperation.-
If the source object is in a general purpose bucket, you must have
s3:GetObjectpermission to read the source object that is being copied. -
If the destination bucket is a general purpose bucket, you must have
s3:PutObjectpermission to write the object copy to the destination bucket.
-
If the source object is in a general purpose bucket, you must have
-
Directory bucket permissions - You must have permissions in a
bucket policy or an IAM identity-based policy based on the source and
destination bucket types in a
CopyObjectoperation.-
If the source object that you want to copy is in a directory bucket, you
must have the
s3express:CreateSessionpermission in theActionelement of a policy to read the object. If no session mode is specified, the session will be created with the maximum allowable privilege, attemptingReadWritefirst, thenReadOnlyifReadWriteis not permitted. If you want to explicitly restrict the access to be read-only, you can set thes3express:SessionModecondition key toReadOnlyon the copy source bucket. -
If the copy destination is a directory bucket, you must have the
s3express:CreateSessionpermission in theActionelement of a policy to write the object to the destination. Thes3express:SessionModecondition key can't be set toReadOnlyon the copy destination bucket.
kms:GenerateDataKeyandkms:Decryptpermissions in IAM identity-based policies and KMS key policies for the KMS key.For example policies, see Example bucket policies for S3 Express One Zone and Amazon Web Services Identity and Access Management (IAM) identity-based policies for S3 Express One Zone in the Amazon S3 User Guide.
-
If the source object that you want to copy is in a directory bucket, you
must have the
-
General purpose bucket permissions - You must have permissions in
an IAM policy based on the source and destination bucket types in a
- Response and special errors
-
When the request is an HTTP 1.1 request, the response is chunk encoded.
When the request is not an HTTP 1.1 request, the response would not
contain the
Content-Length. You always need to read the entire response body to check if the copy succeeds.- If the copy is successful, you receive a response with information about the copied object.
-
A copy request might return an error when Amazon S3 receives the copy
request or while Amazon S3 is copying the files. A
200 OKresponse can contain either a success or an error.- If the error occurs before the copy action starts, you receive a standard Amazon S3 error.
-
If the error occurs during the copy operation, the error response is
embedded in the
200 OKresponse. For example, in a cross-region copy, you may encounter throttling and receive a200 OKresponse. For more information, see Resolve the Error 200 response when copying objects to Amazon S3. The200 OKstatus code means the copy was accepted, but it doesn't mean the copy is complete. Another example is when you disconnect from Amazon S3 before the copy is complete, Amazon S3 might cancel the copy and you may receive a200 OKresponse. You must stay connected to Amazon S3 until the entire response is successfully received and processed.If you call this API operation directly, make sure to design your application to parse the content of the response and handle it appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and apply error handling per your configuration settings (including automatically retrying the request as appropriate). If the condition persists, the SDKs throw an exception (or, for the SDKs that don't use exceptions, they return an error).
- Charge
- The copy request charge is based on the storage class and Region that you specify for the destination object. The request can also result in a data retrieval charge for the source if the source storage class bills for data retrieval. If the copy source is in a different region, the data transfer is billed to the copy source account. For pricing information, see Amazon S3 pricing.
- HTTP Host header syntax
-
-
Directory buckets - The HTTP Host header syntax is
Bucket-name.s3express-zone-id.region-code.amazonaws.com. -
Amazon S3 on Outposts - When you use this action with S3 on
Outposts through the REST API, you must direct requests to the S3 on
Outposts hostname. The S3 on Outposts hostname takes the form
AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com. The hostname isn't required when you use the Amazon Web Services CLI or SDKs.
-
Directory buckets - The HTTP Host header syntax is
CopyObject:
May throw ObjectNotInActiveTierError.
Parameter bucket :
The name of the destination bucket.
Directory buckets - When you use this operation with a directory
bucket, you must use virtual-hosted-style requests in the format
Bucket-name.s3express-zone-id.region-code.amazonaws.com.
Path-style requests are not supported. Directory bucket names must be
unique in the chosen Zone (Availability Zone or Local Zone). Bucket names
must follow the format
bucket-base-name--zone-id--x-s3 (for example,
amzn-s3-demo-bucket--usw2-az1--x-s3). For information
about bucket naming restrictions, see Directory
bucket naming rules in the Amazon S3 User Guide.
Access points - When you use this action with an access point for
general purpose buckets, you must provide the alias of the access point in
place of the bucket name or specify the access point ARN. When you use
this action with an access point for directory buckets, you must provide
the access point name in place of the bucket name. When using the access
point ARN, you must direct requests to the access point hostname. The
access point hostname takes the form
AccessPointName-AccountId.s3-accesspoint.Region.amazonaws.com.
When using this action with an access point through the Amazon Web
Services SDKs, you provide the access point ARN in place of the bucket
name. For more information about access point ARNs, see Using
access points in the Amazon S3 User Guide.
S3 on Outposts - When you use this action with S3 on Outposts, you
must use the Outpost bucket access point ARN or the access point alias for
the destination bucket. You can only copy objects within the same Outpost
bucket. It's not supported to copy objects across different Amazon Web
Services Outposts, between buckets on the same Outposts, or between
Outposts buckets and any other bucket types. For more information about S3
on Outposts, see What
is S3 on Outposts? in the S3 on Outposts guide. When you use
this action with S3 on Outposts through the REST API, you must direct
requests to the S3 on Outposts hostname, in the format
AccessPointName-AccountId.outpostID.s3-outposts.Region.amazonaws.com.
The hostname isn't required when you use the Amazon Web Services CLI or
SDKs.
Parameter copySource :
Specifies the source object for the copy operation. The source object can
be up to 5 GB. If the source object is an object that was uploaded by
using a multipart upload, the object copy will be a single part object
after the source object is copied to the destination bucket.
You specify the value of the copy source in one of two formats, depending on whether you want to access the source object through an access point:
-
For objects not accessed through an access point, specify the name of the
source bucket and the key of the source object, separated by a slash (/).
For example, to copy the object
reports/january.pdffrom the general purpose bucketawsexamplebucket, useawsexamplebucket/reports/january.pdf. The value must be URL-encoded. To copy the objectreports/january.pdffrom the directory bucketawsexamplebucket--use1-az5--x-s3, useawsexamplebucket--use1-az5--x-s3/reports/january.pdf. The value must be URL-encoded. -
For objects accessed through access points, specify the Amazon Resource
Name (ARN) of the object as accessed through the access point, in the
format
arn:aws:s3:. For example, to copy the objectreports/january.pdfthrough access pointmy-access-pointowned by account123456789012in Regionus-west-2, use the URL encoding ofarn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf. The value must be URL encoded. Alternatively, for objects accessed through Amazon S3 on Outposts, specify the ARN of the object as accessed in the formatarn:aws:s3-outposts:. For example, to copy the objectreports/january.pdfthrough outpostmy-outpostowned by account123456789012in Regionus-west-2, use the URL encoding ofarn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf. The value must be URL-encoded.
x-amz-copy-source header by default identifies the current
version of an object to copy. If the current version is a delete marker,
Amazon S3 behaves as if the object was deleted. To copy a different
version, use the versionId query parameter. Specifically,
append ?versionId= to the value (for example,
awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893).
If you don't specify a version ID, Amazon S3 copies the latest version of
the source object.
If you enable versioning on the destination bucket, Amazon S3 generates a
unique version ID for the copied object. This version ID is different from
the version ID of the source object. Amazon S3 returns the version ID of
the copied object in the x-amz-version-id response header in
the response.
If you do not enable versioning or suspend it on the destination bucket,
the version ID that Amazon S3 generates in the
x-amz-version-id response header is always null.
Parameter key :
The key of the destination object.
Parameter acl :
The canned access control list (ACL) to apply to the object.
When you copy an object, the ACL metadata is not preserved and is set to
private by default. Only the owner has full access control.
To override the default ACL setting, specify a new ACL when you generate a
copy request. For more information, see Using
ACLs.
If the destination bucket that you're copying objects to uses the bucket
owner enforced setting for S3 Object Ownership, ACLs are disabled and no
longer affect permissions. Buckets that use this setting only accept
PUT requests that don't specify an ACL or PUT
requests that specify bucket owner full control ACLs, such as the
bucket-owner-full-control canned ACL or an equivalent form of
this ACL expressed in the XML format. For more information, see Controlling
ownership of objects and disabling ACLs in the Amazon S3 User
Guide.
- If your destination bucket uses the bucket owner enforced setting for Object Ownership, all objects written to the bucket by any account will be owned by the bucket owner.
- This functionality is not supported for directory buckets.
- This functionality is not supported for Amazon S3 on Outposts.
Parameter bucketKeyEnabled :
Specifies whether Amazon S3 should use an S3 Bucket Key for object
encryption with server-side encryption using Key Management Service (KMS)
keys (SSE-KMS). If a target object uses SSE-KMS, you can enable an S3
Bucket Key for the object.
Setting this header to true causes Amazon S3 to use an S3
Bucket Key for object encryption with SSE-KMS. Specifying this header with
a COPY action doesn’t affect bucket-level settings for S3 Bucket Key.
For more information, see Amazon S3 Bucket Keys in the Amazon S3 User Guide.
Parameter cacheControl :
Specifies the caching behavior along the request/reply chain.
Parameter checksumAlgorithm :
Indicates the algorithm that you want Amazon S3 to use to create the
checksum for the object. For more information, see Checking
object integrity in the Amazon S3 User Guide.
When you copy an object, if the source object has a checksum, that
checksum value will be copied to the new object by default. If the
CopyObject request does not include this
x-amz-checksum-algorithm header, the checksum algorithm will
be copied from the source object to the destination object (if it's
present on the source object). You can optionally specify a different
checksum algorithm to use with the x-amz-checksum-algorithm
header. Unrecognized or unsupported values will respond with the HTTP
status code 400 Bad Request.
Parameter contentDisposition :
Specifies presentational information for the object. Indicates whether an
object should be displayed in a web browser or downloaded as a file. It
allows specifying the desired filename for the downloaded file.
Parameter contentEncoding :
Specifies what content encodings have been applied to the object and thus
what decoding mechanisms must be applied to obtain the media-type
referenced by the Content-Type header field.
Parameter contentLanguage :
The language the content is in.
Parameter contentType :
A standard MIME type that describes the format of the object data.
Parameter copySourceIfMatch :
Copies the object if its entity tag (ETag) matches the specified tag.
If both the x-amz-copy-source-if-match and
x-amz-copy-source-if-unmodified-since headers are present in
the request and evaluate as follows, Amazon S3 returns 200 OK
and copies the data:
-
x-amz-copy-source-if-matchcondition evaluates to true -
x-amz-copy-source-if-unmodified-sincecondition evaluates to false
Parameter copySourceIfModifiedSince :
Copies the object if it has been modified since the specified time.
If both the x-amz-copy-source-if-none-match and
x-amz-copy-source-if-modified-since headers are present in
the request and evaluate as follows, Amazon S3 returns the 412
Precondition Failed response code:
-
x-amz-copy-source-if-none-matchcondition evaluates to false -
x-amz-copy-source-if-modified-sincecondition evaluates to true
Parameter copySourceIfNoneMatch :
Copies the object if its entity tag (ETag) is different than the specified
ETag.
If both the x-amz-copy-source-if-none-match and
x-amz-copy-source-if-modified-since headers are present in
the request and evaluate as follows, Amazon S3 returns the 412
Precondition Failed response code:
-
x-amz-copy-source-if-none-matchcondition evaluates to false -
x-amz-copy-source-if-modified-sincecondition evaluates to true
Parameter copySourceIfUnmodifiedSince :
Copies the object if it hasn't been modified since the specified time.
If both the x-amz-copy-source-if-match and
x-amz-copy-source-if-unmodified-since headers are present in
the request and evaluate as follows, Amazon S3 returns 200 OK
and copies the data:
-
x-amz-copy-source-if-matchcondition evaluates to true -
x-amz-copy-source-if-unmodified-sincecondition evaluates to false
Parameter copySourceSSECustomerAlgorithm :
Specifies the algorithm to use when decrypting the source object (for
example, AES256).
If the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary encryption information in your request so that Amazon S3 can decrypt the object for copying.
Parameter copySourceSSECustomerKey :
Specifies the customer-provided encryption key for Amazon S3 to use to
decrypt the source object. The encryption key provided in this header must
be the same one that was used when the source object was created.
If the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary encryption information in your request so that Amazon S3 can decrypt the object for copying.
Parameter copySourceSSECustomerKeyMD5 :
Specifies the 128-bit MD5 digest of the encryption key according to RFC
1321. Amazon S3 uses this header for a message integrity check to ensure
that the encryption key was transmitted without error.
If the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary encryption information in your request so that Amazon S3 can decrypt the object for copying.
Parameter expectedBucketOwner :
The account ID of the expected destination bucket owner. If the account ID
that you provide does not match the actual owner of the destination
bucket, the request fails with the HTTP status code 403
Forbidden (access denied).
Parameter expectedSourceBucketOwner :
The account ID of the expected source bucket owner. If the account ID that
you provide does not match the actual owner of the source bucket, the
request fails with the HTTP status code 403 Forbidden (access
denied).
Parameter expires :
The date and time at which the object is no longer cacheable.
Parameter grantFullControl :
Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object.
- This functionality is not supported for directory buckets.
- This functionality is not supported for Amazon S3 on Outposts.
Parameter grantRead :
Allows grantee to read the object data and its metadata.
- This functionality is not supported for directory buckets.
- This functionality is not supported for Amazon S3 on Outposts.
Parameter grantReadACP :
Allows grantee to read the object ACL.
- This functionality is not supported for directory buckets.
- This functionality is not supported for Amazon S3 on Outposts.
Parameter grantWriteACP :
Allows grantee to write the ACL for the applicable object.
- This functionality is not supported for directory buckets.
- This functionality is not supported for Amazon S3 on Outposts.
Parameter ifMatch :
Copies the object if the entity tag (ETag) of the destination object
matches the specified tag. If the ETag values do not match, the operation
returns a 412 Precondition Failed error. If a concurrent
operation occurs during the upload S3 returns a 409
ConditionalRequestConflict response. On a 409 failure you should
fetch the object's ETag and retry the upload.
Expects the ETag value as a string.
For more information about conditional requests, see RFC 7232.
Parameter ifNoneMatch :
Copies the object only if the object key name at the destination does not
already exist in the bucket specified. Otherwise, Amazon S3 returns a
412 Precondition Failed error. If a concurrent operation
occurs during the upload S3 returns a 409
ConditionalRequestConflict response. On a 409 failure you should
retry the upload.
Expects the '*' (asterisk) character.
For more information about conditional requests, see RFC 7232.
Parameter metadata :
A map of metadata to store with the object in S3.
Parameter metadataDirective :
Specifies whether the metadata is copied from the source object or
replaced with metadata that's provided in the request. When copying an
object, you can preserve all metadata (the default) or specify new
metadata. If this header isn’t specified, COPY is the default
behavior.
General purpose bucket - For general purpose buckets, when you
grant permissions, you can use the
s3:x-amz-metadata-directive condition key to enforce certain
metadata behavior when objects are uploaded. For more information, see Amazon
S3 condition key examples in the Amazon S3 User Guide.
Parameter objectLockLegalHoldStatus :
Specifies whether you want to apply a legal hold to the object copy.
Parameter objectLockMode :
The Object Lock mode that you want to apply to the object copy.
Parameter objectLockRetainUntilDate :
The date and time when you want the Object Lock of the object copy to
expire.
Parameter sSECustomerAlgorithm :
Specifies the algorithm to use when encrypting the object (for example,
AES256).
When you perform a CopyObject operation, if you want to use a
different type of encryption setting for the target object, you can
specify appropriate encryption-related headers to encrypt the target
object with an Amazon S3 managed key, a KMS key, or a customer-provided
key. If the encryption setting in your request is different from the
default encryption configuration of the destination bucket, the encryption
setting in your request takes precedence.
Parameter sSECustomerKey :
Specifies the customer-provided encryption key for Amazon S3 to use in
encrypting data. This value is used to store the object and then it is
discarded. Amazon S3 does not store the encryption key. The key must be
appropriate for use with the algorithm specified in the
x-amz-server-side-encryption-customer-algorithm header.
Parameter sSECustomerKeyMD5 :
Specifies the 128-bit MD5 digest of the encryption key according to RFC
1321. Amazon S3 uses this header for a message integrity check to ensure
that the encryption key was transmitted without error.
Parameter sSEKMSEncryptionContext :
Specifies the Amazon Web Services KMS Encryption Context as an additional
encryption context to use for the destination object encryption. The value
of this header is a base64-encoded UTF-8 string holding JSON with the
encryption context key-value pairs.
General purpose buckets - This value must be explicitly added to
specify encryption context for CopyObject requests if you
want an additional encryption context for your destination object. The
additional encryption context of the source object won't be copied to the
destination object. For more information, see Encryption
context in the Amazon S3 User Guide.
Directory buckets - You can optionally provide an explicit encryption context value. The value must match the default encryption context - the bucket Amazon Resource Name (ARN). An additional encryption context value is not supported.
Parameter sSEKMSKeyId :
Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object
encryption. All GET and PUT requests for an object protected by KMS will
fail if they're not made via SSL or using SigV4. For information about
configuring any of the officially supported Amazon Web Services SDKs and
Amazon Web Services CLI, see Specifying
the Signature Version in Request Authentication in the Amazon S3
User Guide.
Directory buckets - To encrypt data using SSE-KMS, it's recommended
to specify the x-amz-server-side-encryption header to
aws:kms. Then, the
x-amz-server-side-encryption-aws-kms-key-id header implicitly
uses the bucket's default KMS customer managed key ID. If you want to
explicitly set the
x-amz-server-side-encryption-aws-kms-key-id header, it must match
the bucket's default customer managed key (using key ID or ARN, not
alias). Your SSE-KMS configuration can only support 1 customer
managed key per directory bucket's lifetime. The Amazon
Web Services managed key (aws/s3) isn't supported.
Incorrect key specification results in an HTTP 400 Bad
Request error.
Parameter serverSideEncryption :
The server-side encryption algorithm used when storing this object in
Amazon S3. Unrecognized or unsupported values won’t write a destination
object and will receive a 400 Bad Request response.
Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When copying an object, if you don't specify encryption information in your copy request, the encryption setting of the target object is set to the default encryption configuration of the destination bucket. By default, all buckets have a base level of encryption configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). If the destination bucket has a different default encryption configuration, Amazon S3 uses the corresponding encryption key to encrypt the target object copy.
With server-side encryption, Amazon S3 encrypts your data as it writes your data to disks in its data centers and decrypts the data when you access it. For more information about server-side encryption, see Using Server-Side Encryption in the Amazon S3 User Guide.
General purpose buckets
- For general purpose buckets, there are the following supported options for server-side encryption: server-side encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), and server-side encryption with customer-provided encryption keys (SSE-C). Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the target object copy.
-
When you perform a
CopyObjectoperation, if you want to use a different type of encryption setting for the target object, you can specify appropriate encryption-related headers to encrypt the target object with an Amazon S3 managed key, a KMS key, or a customer-provided key. If the encryption setting in your request is different from the default encryption configuration of the destination bucket, the encryption setting in your request takes precedence.
-
For directory buckets, there are only two supported options for
server-side encryption: server-side encryption with Amazon S3 managed keys
(SSE-S3) (
AES256) and server-side encryption with KMS keys (SSE-KMS) (aws:kms). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in yourCreateSessionrequests orPUTobject requests. Then, new objects are automatically encrypted with the desired encryption settings. For more information, see Protecting data with server-side encryption in the Amazon S3 User Guide. For more information about the encryption overriding behaviors in directory buckets, see Specifying server-side encryption with KMS for new object uploads. -
To encrypt new object copies to a directory bucket with SSE-KMS, we
recommend you specify SSE-KMS as the directory bucket's default encryption
configuration with a KMS key (specifically, a customer
managed key). The Amazon
Web Services managed key (
aws/s3) isn't supported. Your SSE-KMS configuration can only support 1 customer managed key per directory bucket for the lifetime of the bucket. After you specify a customer managed key for SSE-KMS, you can't override the customer managed key for the bucket's SSE-KMS configuration. Then, when you perform aCopyObjectoperation and want to specify server-side encryption settings for new object copies with SSE-KMS in the encryption-related request headers, you must ensure the encryption key is the same customer managed key that you specified for the directory bucket's default encryption configuration. -
S3 access points for Amazon FSx - When accessing data stored in
Amazon FSx file systems using S3 access points, the only valid server side
encryption option is
aws:fsx. All Amazon FSx file systems have encryption configured by default and are encrypted at rest. Data is automatically encrypted before being written to the file system, and automatically decrypted as it is read. These processes are handled transparently by Amazon FSx.
Parameter storageClass :
If the x-amz-storage-class header is not used, the copied
object will be stored in the STANDARD Storage Class by
default. The STANDARD storage class provides high durability
and high availability. Depending on performance needs, you can specify a
different Storage Class.
-
Directory buckets - Directory buckets only support
EXPRESS_ONEZONE(the S3 Express One Zone storage class) in Availability Zones andONEZONE_IA(the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones. Unsupported storage class values won't write a destination object and will respond with the HTTP status code400 Bad Request. -
Amazon S3 on Outposts - S3 on Outposts only uses the
OUTPOSTSStorage Class.
CopyObject action to change the storage class
of an object that is already stored in Amazon S3 by using the
x-amz-storage-class header. For more information, see Storage
Classes in the Amazon S3 User Guide.
Before using an object as a source object for the copy operation, you must restore a copy of it if it meets any of the following conditions:
-
The storage class of the source object is
GLACIERorDEEP_ARCHIVE. -
The storage class of the source object is
INTELLIGENT_TIERINGand it's S3 Intelligent-Tiering access tier isArchive AccessorDeep Archive Access.
Parameter tagging :
The tag-set for the object copy in the destination bucket. This value must
be used in conjunction with the x-amz-tagging-directive if
you choose REPLACE for the
x-amz-tagging-directive. If you choose COPY for
the x-amz-tagging-directive, you don't need to set the
x-amz-tagging header, because the tag-set will be copied from
the source object directly. The tag-set must be encoded as URL Query
parameters.
The default value is the empty value.
-
When you attempt to
COPYthe tag-set from an S3 source object that has non-empty tags. -
When you attempt to
REPLACEthe tag-set of a source object and set a non-empty value tox-amz-tagging. -
When you don't set the
x-amz-tagging-directiveheader and the source object has non-empty tags. This is because the default value ofx-amz-tagging-directiveisCOPY.
CopyObject operation, the following situations are allowed:
-
When you attempt to
COPYthe tag-set from a directory bucket source object that has no tags to a general purpose bucket. It copies an empty tag-set to the destination object. -
When you attempt to
REPLACEthe tag-set of a directory bucket source object and set thex-amz-taggingvalue of the directory bucket destination object to empty. -
When you attempt to
REPLACEthe tag-set of a general purpose bucket source object that has non-empty tags and set thex-amz-taggingvalue of the directory bucket destination object to empty. -
When you attempt to
REPLACEthe tag-set of a directory bucket source object and don't set thex-amz-taggingvalue of the directory bucket destination object. This is because the default value ofx-amz-taggingis the empty value.
Parameter taggingDirective :
Specifies whether the object tag-set is copied from the source object or
replaced with the tag-set that's provided in the request.
The default value is COPY.
-
When you attempt to
COPYthe tag-set from an S3 source object that has non-empty tags. -
When you attempt to
REPLACEthe tag-set of a source object and set a non-empty value tox-amz-tagging. -
When you don't set the
x-amz-tagging-directiveheader and the source object has non-empty tags. This is because the default value ofx-amz-tagging-directiveisCOPY.
CopyObject operation, the following situations are allowed:
-
When you attempt to
COPYthe tag-set from a directory bucket source object that has no tags to a general purpose bucket. It copies an empty tag-set to the destination object. -
When you attempt to
REPLACEthe tag-set of a directory bucket source object and set thex-amz-taggingvalue of the directory bucket destination object to empty. -
When you attempt to
REPLACEthe tag-set of a general purpose bucket source object that has non-empty tags and set thex-amz-taggingvalue of the directory bucket destination object to empty. -
When you attempt to
REPLACEthe tag-set of a directory bucket source object and don't set thex-amz-taggingvalue of the directory bucket destination object. This is because the default value ofx-amz-taggingis the empty value.
Parameter websiteRedirectLocation :
If the destination bucket is configured as a website, redirects requests
for this object copy to another object in the same bucket or to an
external URL. Amazon S3 stores the value of this header in the object
metadata. This value is unique to each object and is not copied when using
the x-amz-metadata-directive header. Instead, you may opt to
provide this header in combination with the
x-amz-metadata-directive header.
Implementation
Future<CopyObjectOutput> copyObject({
required String bucket,
required String copySource,
required String key,
ObjectCannedACL? acl,
bool? bucketKeyEnabled,
String? cacheControl,
ChecksumAlgorithm? checksumAlgorithm,
String? contentDisposition,
String? contentEncoding,
String? contentLanguage,
String? contentType,
String? copySourceIfMatch,
DateTime? copySourceIfModifiedSince,
String? copySourceIfNoneMatch,
DateTime? copySourceIfUnmodifiedSince,
String? copySourceSSECustomerAlgorithm,
String? copySourceSSECustomerKey,
String? copySourceSSECustomerKeyMD5,
String? expectedBucketOwner,
String? expectedSourceBucketOwner,
String? expires,
String? grantFullControl,
String? grantRead,
String? grantReadACP,
String? grantWriteACP,
String? ifMatch,
String? ifNoneMatch,
Map<String, String>? metadata,
MetadataDirective? metadataDirective,
ObjectLockLegalHoldStatus? objectLockLegalHoldStatus,
ObjectLockMode? objectLockMode,
DateTime? objectLockRetainUntilDate,
RequestPayer? requestPayer,
String? sSECustomerAlgorithm,
String? sSECustomerKey,
String? sSECustomerKeyMD5,
String? sSEKMSEncryptionContext,
String? sSEKMSKeyId,
ServerSideEncryption? serverSideEncryption,
StorageClass? storageClass,
String? tagging,
TaggingDirective? taggingDirective,
String? websiteRedirectLocation,
}) async {
final headers = <String, String>{
'x-amz-copy-source': copySource.toString(),
if (acl != null) 'x-amz-acl': acl.value,
if (bucketKeyEnabled != null)
'x-amz-server-side-encryption-bucket-key-enabled':
bucketKeyEnabled.toString(),
if (cacheControl != null) 'Cache-Control': cacheControl.toString(),
if (checksumAlgorithm != null)
'x-amz-checksum-algorithm': checksumAlgorithm.value,
if (contentDisposition != null)
'Content-Disposition': contentDisposition.toString(),
if (contentEncoding != null)
'Content-Encoding': contentEncoding.toString(),
if (contentLanguage != null)
'Content-Language': contentLanguage.toString(),
if (contentType != null) 'Content-Type': contentType.toString(),
if (copySourceIfMatch != null)
'x-amz-copy-source-if-match': copySourceIfMatch.toString(),
if (copySourceIfModifiedSince != null)
'x-amz-copy-source-if-modified-since':
_s.rfc822ToJson(copySourceIfModifiedSince),
if (copySourceIfNoneMatch != null)
'x-amz-copy-source-if-none-match': copySourceIfNoneMatch.toString(),
if (copySourceIfUnmodifiedSince != null)
'x-amz-copy-source-if-unmodified-since':
_s.rfc822ToJson(copySourceIfUnmodifiedSince),
if (copySourceSSECustomerAlgorithm != null)
'x-amz-copy-source-server-side-encryption-customer-algorithm':
copySourceSSECustomerAlgorithm.toString(),
if (copySourceSSECustomerKey != null)
'x-amz-copy-source-server-side-encryption-customer-key':
copySourceSSECustomerKey.toString(),
if (copySourceSSECustomerKeyMD5 != null)
'x-amz-copy-source-server-side-encryption-customer-key-MD5':
copySourceSSECustomerKeyMD5.toString(),
if (expectedBucketOwner != null)
'x-amz-expected-bucket-owner': expectedBucketOwner.toString(),
if (expectedSourceBucketOwner != null)
'x-amz-source-expected-bucket-owner':
expectedSourceBucketOwner.toString(),
if (expires != null) 'Expires': expires.toString(),
if (grantFullControl != null)
'x-amz-grant-full-control': grantFullControl.toString(),
if (grantRead != null) 'x-amz-grant-read': grantRead.toString(),
if (grantReadACP != null) 'x-amz-grant-read-acp': grantReadACP.toString(),
if (grantWriteACP != null)
'x-amz-grant-write-acp': grantWriteACP.toString(),
if (ifMatch != null) 'If-Match': ifMatch.toString(),
if (ifNoneMatch != null) 'If-None-Match': ifNoneMatch.toString(),
if (metadata != null)
...metadata.map((key, value) => MapEntry('x-amz-meta-$key', value)),
if (metadataDirective != null)
'x-amz-metadata-directive': metadataDirective.value,
if (objectLockLegalHoldStatus != null)
'x-amz-object-lock-legal-hold': objectLockLegalHoldStatus.value,
if (objectLockMode != null)
'x-amz-object-lock-mode': objectLockMode.value,
if (objectLockRetainUntilDate != null)
'x-amz-object-lock-retain-until-date':
_s.iso8601ToJson(objectLockRetainUntilDate),
if (requestPayer != null) 'x-amz-request-payer': requestPayer.value,
if (sSECustomerAlgorithm != null)
'x-amz-server-side-encryption-customer-algorithm':
sSECustomerAlgorithm.toString(),
if (sSECustomerKey != null)
'x-amz-server-side-encryption-customer-key': sSECustomerKey.toString(),
if (sSECustomerKeyMD5 != null)
'x-amz-server-side-encryption-customer-key-MD5':
sSECustomerKeyMD5.toString(),
if (sSEKMSEncryptionContext != null)
'x-amz-server-side-encryption-context':
sSEKMSEncryptionContext.toString(),
if (sSEKMSKeyId != null)
'x-amz-server-side-encryption-aws-kms-key-id': sSEKMSKeyId.toString(),
if (serverSideEncryption != null)
'x-amz-server-side-encryption': serverSideEncryption.value,
if (storageClass != null) 'x-amz-storage-class': storageClass.value,
if (tagging != null) 'x-amz-tagging': tagging.toString(),
if (taggingDirective != null)
'x-amz-tagging-directive': taggingDirective.value,
if (websiteRedirectLocation != null)
'x-amz-website-redirect-location': websiteRedirectLocation.toString(),
};
final $result = await _protocol.sendRaw(
method: 'PUT',
requestUri:
'/${Uri.encodeComponent(bucket)}/${key.split('/').map(Uri.encodeComponent).join('/')}?x-id=CopyObject',
headers: headers,
exceptionFnMap: _exceptionFns,
);
final $elem = await _s.xmlFromResponse($result);
return CopyObjectOutput(
copyObjectResult: CopyObjectResult.fromXml($elem),
bucketKeyEnabled: _s.extractHeaderBoolValue(
$result.headers, 'x-amz-server-side-encryption-bucket-key-enabled'),
copySourceVersionId: _s.extractHeaderStringValue(
$result.headers, 'x-amz-copy-source-version-id'),
expiration:
_s.extractHeaderStringValue($result.headers, 'x-amz-expiration'),
requestCharged: _s
.extractHeaderStringValue($result.headers, 'x-amz-request-charged')
?.let(RequestCharged.fromString),
sSECustomerAlgorithm: _s.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption-customer-algorithm'),
sSECustomerKeyMD5: _s.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption-customer-key-MD5'),
sSEKMSEncryptionContext: _s.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption-context'),
sSEKMSKeyId: _s.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption-aws-kms-key-id'),
serverSideEncryption: _s
.extractHeaderStringValue(
$result.headers, 'x-amz-server-side-encryption')
?.let(ServerSideEncryption.fromString),
versionId:
_s.extractHeaderStringValue($result.headers, 'x-amz-version-id'),
);
}