

# 从目录存储桶复制对象或向目录存储桶复制对象
<a name="directory-buckets-objects-copy"></a>

复制操作将创建已存储在 Amazon S3 中的对象的副本。您可以在目录存储桶和通用存储桶之间复制对象。您还可以在一个存储桶内复制对象，也可以在同一类型的存储桶之间复制对象，例如，从目录存储桶复制到目录存储桶。

**注意**  
当源存储桶或目标存储桶位于 AWS 本地区域时，不支持跨不同 AWS 区域复制对象。源存储桶和目标存储桶必须具有相同的父 AWS 区域。源存储桶和目标存储桶可以是不同的存储桶位置类型（可用区或本地区域）。

在单个原子操作中，您可以创建最大 5GB 的对象副本。但是，要复制大于 5GB 的对象，您必须使用分段上传 API 操作。有关更多信息，请参阅 [对目录桶使用分段上传](s3-express-using-multipart-upload.md)。

**权限**  
 要复制对象，您必须拥有以下权限：
+ 要将对象从一个目录存储桶复制到另一个目录存储桶，您必须拥有 `s3express:CreateSession` 权限。
+ 要将对象从目录存储桶复制到通用存储桶，您必须拥有将对象副本写入目标存储桶的 `s3express:CreateSession` 权限和 `s3:PutObject` 权限。
+ 要将对象从通用桶复制到目录桶，您必须拥有读取正在复制的源对象的 `s3express:CreateSession` 权限和 `s3:GetObject` 权限。

   有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)。

**加密**  
Amazon S3 会自动加密上传到 S3 存储桶的所有新对象。S3 存储桶的默认加密配置始终处于启用状态，并至少设置为具有 Amazon S3 托管密钥的服务器端加密（SSE-S3）。

对于目录存储桶，支持 SSE-S3 和具有 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）。当目标存储桶是目录存储桶时，我们建议，目标存储桶的默认加密使用所需的加密配置，并且不要覆盖存储桶的默认加密。然后，使用所需的加密设置自动对新对象进行加密。此外，当您通过 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html) 将 SSE-KMS 加密的对象从通用存储桶复制到目录存储桶、从目录存储桶复制到通用存储桶，或在目录存储桶之间复制时，不支持 S3 存储桶密钥。在这种情况下，每次对 KMS 加密的对象发出复制请求时，Amazon S3 都会调用 AWS KMS。有关目录存储桶中加密覆盖行为的更多信息，请参阅 [Specifying server-side encryption with AWS KMS for new object uploads](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html)。

对于通用桶，您可以使用 SSE-S3（默认）、采用 AWS Key Management Service（AWS KMS）密钥的服务器端加密（SSE-KMS）、采用 AWS KMS 密钥的双层服务器端加密（DSSE-KMS），或采用客户提供密钥的服务器端加密（SSE-C）。

如果您发出复制请求来指定对目录存储桶（源存储桶或目标存储桶）使用 DSSE-KMS 或 SSE-C，则响应将返回错误。

**标签**  
目录存储桶不支持标签。如果您将带有标签的对象从通用桶复制到目录桶，您会收到 HTTP `501 (Not Implemented)` 响应。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)。

**ETag**  
S3 Express One Zone 的实体标签（ETag）是随机的字母数字字符串，而不是 MD5 校验和。为协助确保对象完整性，请使用额外的校验和。

**其他校验和**  
S3 Express One Zone 可让您选择用于在上传或下载过程中验证数据的校验和算法。您可以选择以下安全哈希算法（SHA）或循环冗余校验（CRC）数据完整性检查算法之一：CRC32、CRC32C、SHA-1 和 SHA-256。S3 Express One Zone 存储类不支持基于 MD5 的校验和。

有关更多信息，请参阅 [其他 S3 校验和最佳实践](s3-express-optimizing-performance.md#s3-express-optimizing-performance-checksums)。

**支持的功能**  
有关 S3 Express One Zone 支持哪些 Amazon S3 特征的更多信息，请参阅[目录存储桶的差异](s3-express-differences.md)。

## 使用 S3 控制台（复制到目录存储桶）
<a name="directory-bucket-copy-console"></a>

**注意**  
使用控制台将对象复制到目录存储桶时的限制和局限性如下所示：  
`Copy` 操作适用于指定文件夹（前缀）中的所有对象。当正在执行操作时添加到这些文件夹的对象可能受到影响。
无法使用 S3 控制台复制使用客户提供的加密密钥（SSE-C）加密的对象。要复制使用 SSE-C 加密的对象，请使用 AWS CLI、AWS SDK 或 Amazon S3 REST API。
复制的对象将不会保留原始对象的对象锁定设置。
如果要从中复制对象的存储桶对于 S3 对象所有权使用“强制存储桶拥有者”设置，则对象 ACL 将不会复制到指定的目标。
如果要将对象复制到对于 S3 对象所有权使用“强制存储桶拥有者”设置的存储桶，请确保源存储桶也使用“强制存储桶拥有者”设置，或移除对其它 AWS 账户和组的任何对象 ACL 授权。
从通用存储桶复制到目录存储桶的对象将不会保留对象标签、ACL 或 Etag 值。可以复制校验和值，但它们并不等同于 Etag。与添加时相比，校验和值可能会发生变化。
 复制到目录存储桶的所有对象都将对 S3 对象所有权使用“强制存储桶拥有者”设置。

**将对象从通用桶或目录桶复制到目录桶**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择您要从中复制对象的存储桶：
   + 要从通用桶进行复制，请选择**通用桶**选项卡。
   + 要从目录桶进行复制，请选择**目录桶**选项卡。

1. 选择包含要复制的对象的通用桶或目录桶。

1. 请选择**对象**选项卡。在**对象**页面上，选中要复制的对象名称左侧的复选框。

1. 在 **Actions (操作)** 菜单中，选择 **Copy (复制)**。

   将出现**复制**页面。

1. 在**目标**下，为您的目标类型选择**目录桶**。要指定目标路径，请选择**浏览 S3**，导航到目标，然后选中目标左侧的选项按钮。选择右下角的**选择目标**。

   或者，输入目标路径。

1. 在**其它复制设置**下，选择是要**复制源设置**、**请勿指定设置**还是**指定设置**。**复制源设置**是默认选项。如果您只想复制不带源设置属性的对象，请选择**请勿指定设置**。选择**指定设置**来指定服务器端加密、校验和以及元数据的设置。

1. 选择右下角的**复制**。Amazon S3 会将对象复制到目标。

## 使用 S3 控制台（复制到通用存储桶）
<a name="directory-bucket-copy-console"></a>

**注意**  
使用控制台将对象复制到通用存储桶时的限制和局限性如下所示：  
`Copy` 操作适用于指定文件夹（前缀）中的所有对象。当正在执行操作时添加到这些文件夹的对象可能受到影响。
无法使用 S3 控制台复制使用客户提供的加密密钥（SSE-C）加密的对象。要复制使用 SSE-C 加密的对象，请使用 AWS CLI、AWS SDK 或 Amazon S3 REST API。
复制的对象将不会保留原始对象的对象锁定设置。
如果要从中复制对象的存储桶对于 S3 对象所有权使用“强制存储桶拥有者”设置，则对象 ACL 将不会复制到指定的目标。
如果要将对象复制到对于 S3 对象所有权使用“强制存储桶拥有者”设置的存储桶，请确保源存储桶也使用“强制存储桶拥有者”设置，或移除对其它 AWS 账户和组的任何对象 ACL 授权。

**将对象从目录存储桶复制到通用存储桶**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 Amazon S3 控制台：[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 在左侧导航窗格中，选择**存储桶**。

1. 选择**目录桶**选项卡。

1. 选择包含您要复制的对象的目录桶。

1. 请选择**对象**选项卡。在**对象**页面上，选中要复制的对象名称左侧的复选框。

1. 在 **Actions (操作)** 菜单中，选择 **Copy (复制)**。

    

1. 在**目标**下，为您的目标类型选择**通用桶**。要指定目标路径，请选择**浏览 S3**，导航到目标，然后选中目标左侧的选项按钮。选择右下角的**选择目标**。

   或者，输入目标路径。

1. 在**其它复制设置**下，选择是要**复制源设置**、**请勿指定设置**还是**指定设置**。**复制源设置**是默认选项。如果您只想复制不带源设置属性的对象，请选择**请勿指定设置**。选择**指定设置**，来指定存储类、ACL、对象标签、元数据、服务器端加密和其它校验和的设置。

1. 选择右下角的**复制**。Amazon S3 会将对象复制到目标。

## 使用 AWS SDK
<a name="directory-bucket-copy-sdks"></a>

------
#### [ SDK for Java 2.x ]

**Example**  

```
 public static void copyBucketObject (S3Client s3, String sourceBucket, String objectKey, String targetBucket) {
      CopyObjectRequest copyReq = CopyObjectRequest.builder()
          .sourceBucket(sourceBucket)
          .sourceKey(objectKey)
          .destinationBucket(targetBucket)
          .destinationKey(objectKey)
          .build();
       String temp = "";
                                             
       try {
           CopyObjectResponse copyRes = s3.copyObject(copyReq);
           System.out.println("Successfully copied " + objectKey +" from bucket " + sourceBucket +" into bucket "+targetBucket);
       }
       
       catch (S3Exception e) {
           System.err.println(e.awsErrorDetails().errorMessage());
           System.exit(1);
       }
 }
```

------

## 使用 AWS CLI
<a name="directory-copy-object-cli"></a>

以下 `copy-object` 示例命令显示了如何使用 AWS CLI 将对象从一个存储桶复制到另一个存储库。您可以在存储桶类型之间复制对象。要运行此命令，请将用户输入占位符替换为您自己的信息。

```
aws s3api copy-object --copy-source SOURCE_BUCKET/SOURCE_KEY_NAME --key TARGET_KEY_NAME --bucket TARGET_BUCKET_NAME
```

有关更多信息，请参阅《AWS CLI Command Reference》**中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/copy-object.html)。