

# 上传对象
<a name="upload-objects"></a>

在您将文件上传至 Amazon S3 时，文件会存储为 S3 *对象*。对象由文件数据和描述对象的元数据组成。一个存储桶中可以有无限量的对象。您需要拥有存储桶写入权限，才能将文件上传至 Amazon S3 存储桶。有关访问权限的更多信息，请参阅[Amazon S3 的身份和访问管理](security-iam.md)。

您可以将任何类型的文件上传至 S3 存储桶，包括图像、备份、数据、电影等。可使用 Amazon S3 控制台上传的文件的最大大小为 160 GB。要上传大于 160GB 的文件，请使用 Amazon Command Line Interface（Amazon CLI）、Amazon SDK 或 Amazon S3 REST API。

如果启用了版本控制的存储桶中已存在所上传对象的键名，则 Amazon S3 会创建该对象的另一个版本，而不是替换现有对象。有关启用版本控制的更多信息，请参阅[在存储桶上启用版本控制](manage-versioning-examples.md)。

 根据您要上传的数据大小，Amazon S3 提供以下选项：
+ **使用 Amazon SDK、REST API 或 Amazon CLI 在单个操作中上传对象** – 您可以在单个 `PUT` 操作中上传最大为 5GB 的单个对象。
+ **使用 Amazon S3 控制台上传单个对象**** –** 通过 Amazon S3 控制台，您可以上传最大 160GB 的单个对象。
+ **使用 Amazon SDK、REST API 或 Amazon CLI 分段上传对象**** – **您可以使用分段上传 API 操作来上传单个大型对象（最大大小为 50TB）。

  分段上传 API 操作旨在改进大型对象的上传体验。您可以分段上传对象。这些对象分段可以按任何顺序并行独立上传。您可以对大小在 5 MB 到 50 TB 范围内的对象使用分段上传。有关更多信息，请参阅 [在 Amazon S3 中使用分段上传来上传和复制对象](mpuoverview.md)。

要上传大于 5 TB 的文件，请使用 Java v1/v2、Python 或 Amazon CLI SDK 版本的 S3 Transfer Manager。要获得最佳性能，请将最新的 Amazon 通用运行时（CRT）与这些 SDK 配合使用，该运行时已经过优化，可以提高资源利用率。

从内存流上传大型对象时，CRT 会缓冲每个分段，最多占用 5 GB 内存，从而按照分配的内存来限制总吞吐量。您可以使用配置选项（例如，对于 Java SDK 使用 `maxNativeMemoryLimitInBytes`）来调整 CRT 内存限制。对于从磁盘上传，CRT 会自动切换到直接磁盘流式传输而不是中间分段缓冲，从而提高内存使用率。系统会自动为大型对象启用此行为，不过您也可通过请求参数（例如，对于 Amazon CLI 使用 `should_stream`，对于 Java SDK 使用 `CRT_MEMORY_BUFFER_DISABLED`）为较小的文件启用此行为。

当您上传对象时，默认情况下，将使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）自动加密对象。当您下载对象时，该对象将被解密。有关更多信息，请参阅[为 Amazon S3 存储桶设置默认服务器端加密行为](bucket-encryption.md)和[利用加密来保护数据](UsingEncryption.md)。

上传对象时，如果您想使用不同类型的默认加密，也可以在 S3 `PUT` 请求中指定具有 Amazon Key Management Service（Amazon KMS）密钥的服务器端加密（SSE-KMS），或者将目标存储桶中的默认加密配置设置为使用 SSE-KMS 来加密数据。有关 SSE-KMS 的更多信息，请参阅 [使用 Amazon KMS (SSE-KMS) 指定服务器端加密](specifying-kms-encryption.md)。如果您希望使用其他账户拥有的 KMS 密钥，则您必须有权使用该密钥。有关 KMS 密钥的跨账户权限的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[创建其他账户可以使用的 KMS 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/key-policy-modifying-external-accounts.html#cross-account-console)。

如果您在 Amazon S3 中遇到拒绝访问（403 禁止访问）错误，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](troubleshoot-403-errors.md)详细了解其常见原因。

## 上传对象
<a name="upload-objects-procedure"></a>

### 使用 S3 控制台
<a name="upload-objects-by-drag-and-drop"></a>

此过程介绍如何使用控制台将对象和文件夹上传到 Amazon S3 存储桶。

上传对象时，对象键名称是文件名和任何可选前缀。在 Amazon S3 控制台中，您可以创建文件夹来组织对象。在 Amazon S3 中，文件夹表示为出现在对象键名称中的前缀。如果您将单个对象上传到 Amazon S3 控制台中的文件夹，则文件夹名称将包含在对象键名称中。

例如，如果您将名为的对象上传 `sample1.jpg` 到名为 `backup` 的文件夹，则密钥名称为 `backup/sample1.jpg`。但是，对象会像 `sample1.jpg` 在 `backup` 文件夹中一样在控制台中显示。有关键名称的更多信息，请参阅 [使用对象元数据](UsingMetadata.md)。

**注意**  
如果在 Amazon S3 控制台中重命名对象或更改诸如**存储类**、**加密**或**元数据**等任何属性，将创建一个新对象来替换旧对象。如果启用 S3 版本控制，则会创建对象的新版本，而现有对象将变为旧版本。更改属性的角色也会成为新对象（或对象版本）的拥有者。

上传文件夹时，Amazon S3 会将所有文件和子文件夹从指定文件夹中上传至存储桶。然后，它会分配由上传文件名和文件夹名组成的对象键名。例如，如果您上传包含 `/images` 和 `sample1.jpg` 这两个文件的名为 `sample2.jpg` 的文件夹，则 Amazon S3 会上传这两个文件，然后分配相应的键名 `images/sample1.jpg` 和 `images/sample2.jpg`。键名包括作为前缀的文件夹名。Amazon S3 控制台仅显示最后一个“`/`”后面的键名部分。例如，在 `images` 文件夹中，`images/sample1.jpg` 和 `images/sample2.jpg` 对象显示为 `sample1.jpg` 和 `sample2.jpg`。<a name="upload-files-folders"></a>

**将文件夹和文件上传到 S3 存储桶**

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

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

1. 在 **Buckets**（存储桶） 列表中，请选择要将文件夹和文件上传到的存储桶的名称。

1. 请选择 **Upload**（上传）。

1. 在**上传**窗口中，执行下列操作之一：
   + 将文件和文件夹拖放到**上传**窗口。
   + 选择**添加文件**或**添加文件夹**，选择要上传的文件或文件夹，然后选择**打开**。

1. 要启用版本控制，请在**目标**下选择**启用存储桶版本控制**。

1. 要上传列出的文件和文件夹而不配置其他上传选项，请选择页面底部的**上传**。

   Amazon S3 会上传您的对象和文件夹。上传完成后，您可以在**上传：状态**页面上看到成功消息。<a name="configure-additional-properties"></a>

**配置其他对象属性**

1. 要更改访问控制列表权限，请选择 **Permissions**（权限）。

1. 在 **Access control list (ACL)** [访问控制列表 (ACL)]下，编辑权限。

   有关对象访问权限的信息，请参阅 [使用 S3 控制台为对象设置 ACL 权限](managing-acls.md#set-object-permissions)。您可以向公众（世界上的每一个人）授予对您的对象的读取访问权限，使其能够获取您正在上传的所有文件。但是，我们建议您不要更改公共读取访问的默认设置。授予公有读取访问权限适用于一小部分的使用案例（如存储桶用于网站时）。您始终可以在上传对象后更改对象权限。

1. 要配置其他附加属性，请选择 **Properties**（属性）。

1. 在**存储类**下，为正在上传的文件选择存储类。

   有关存储类的更多信息，请参阅 [了解和管理 Amazon S3 存储类](storage-class-intro.md)。

1. 要更新对象的加密设置，请在**服务器端加密设置**下执行以下操作：

   1. 选择 **Specify an encryption key**（指定加密密钥）。

   1. 在**加密设置**下，选择**使用默认加密的存储桶设置**或**覆盖默认加密的存储桶设置**。

   1. 如果您选择**覆盖默认加密的存储桶设置**，则必须配置以下加密设置。
      + 要使用由 Amazon S3 托管的密钥加密上传的文件，请选择 **Amazon S3 托管式密钥（SSE-S3）**。

        有关更多信息，请参阅 [使用具有 Amazon S3 托管式密钥的服务器端加密（SSE-S3）](UsingServerSideEncryption.md)。
      + 要使用存储在 Amazon Key Management Service（Amazon KMS）中的密钥加密上传的文件，请选择 **Amazon Key Management Service 密钥（SSE-KMS）**。然后，为 **Amazon KMS 密钥**选择以下选项之一：
        + 要从可用的 KMS 密钥列表中进行选择，请选择**从您的 Amazon KMS keys 中进行选择**，然后从可用密钥的列表中选择您的 **KMS 密钥**。

          Amazon 托管式密钥（`aws/s3`）和您的客户自主管理型密钥都显示在此列表中。有关客户自主管理型密钥的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[客户密钥和 Amazon 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/concepts.html#key-mgmt)。
        + 要输入 KMS 密钥 ARN，请选择**输入 Amazon KMS key ARN**，然后在显示的字段中输入您的 KMS 密钥 ARN。
        + 要在 Amazon KMS 控制台中创建新的客户自主管理型密钥，请选择**创建 KMS 密钥**。

          有关创建 Amazon KMS key 的更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[创建密钥](https://docs.amazonaws.cn//kms/latest/developerguide/create-keys.html)。
**重要**  
您只能使用与存储桶所在相同的 Amazon Web Services 区域中可用的 KMS 密钥。Amazon S3 控制台仅列出与存储桶位于同一区域中的前 100 个 KMS 密钥。要使用未列出的 KMS 密钥，您必须输入 KMS 密钥 ARN。如果您希望使用其他账户拥有的 KMS 密钥，则必须首先有权使用该密钥，然后必须输入相应的 KMS 密钥 ARN。  
Amazon S3 仅支持对称加密 KMS 密钥，不支持非对称 KMS 密钥。有关更多信息，请参阅《Amazon Key Management Service 开发人员指南》**中的[确定对称和非对称 KMS 密钥](https://docs.amazonaws.cn//kms/latest/developerguide/find-symm-asymm.html)。

1. 要使用其他校验和，请选择 **On**（打开）。然后对于 **Checksum function**（校验和函数），选择要使用的函数。Amazon S3 在收到整个对象后计算并存储校验和值。您可以使用 **Precalculated value**（预计算值）框来提供预先计算的值。这样，Amazon S3 会将您提供的值与其计算的值进行比较。如果两个值不匹配，Amazon S3 将生成错误。

   其他校验和使您能够指定要用于验证数据的校验和算法。有关其他校验和的更多信息，请参阅[在 Amazon S3 中检查对象完整性](checking-object-integrity.md)。

1. 要向上传的所有对象添加标签，请选择 **Add tag (添加标签)**。在**键**字段中输入标签名称。输入标签的值。

   对象标签为您提供了对存储进行分类的方法。每个标签都是一个键-值对。键和标签值区分大小写。对于每个对象，您最多可以有 10 个标签。标签键的长度最大可以为 128 个 Unicode 字符，标签值的长度最大可以为 255 个 Unicode 字符。有关对象标签的更多信息，请参阅 [使用标签对对象进行分类](object-tagging.md)。

1. 要添加元数据，请选择**添加元数据**。

   1. 在**类型**下，请选择**系统定义**或**用户定义**。

      对于系统定义元数据，您可以选择通用的 HTTP 标头，如 **Content-Type** 和 **Content-Disposition**。有关系统定义元数据的列表以及您能否添加值的信息，请参阅[系统定义的对象元数据](UsingMetadata.md#SysMetadata)。以前缀 `x-amz-meta-` 开头的任何元数据都被视为用户定义的元数据。用户定义元数据会与对象存储在一起，并会在您下载该对象时返回。密钥及其值均必须符合 US-ASCII 标准。用户定义元数据最大可为 2 KB。如需详细了解系统定义和用户定义的元数据，请参阅[使用对象元数据](UsingMetadata.md)。

   1. 对于**键**，请选择一个键。

   1. 键入该键的值。

1. 要上传对象，请选择**上传**。

   Amazon S3 将上传您的对象。上传完成后，您可以在**上传：状态**页面上看到成功消息。

1. 请选择 **Exit**（退出）。

### 使用 Amazon CLI
<a name="UploadObjSingleOpCLI"></a>

您可以发送 `PUT` 请求，在单个操作中上传最大 5 GB 的对象。有关更多信息，请参阅 *Amazon CLI 命令参考*中的 [https://docs.amazonaws.cn/cli/latest/reference/s3api/put-object.html#examples](https://docs.amazonaws.cn/cli/latest/reference/s3api/put-object.html#examples) 示例。

### 使用 REST API
<a name="UploadObjSingleOpREST"></a>

您可以发送 REST 请求以上传对象。您可以发送 `PUT` 请求以在单个操作中上传数据。有关更多信息，请参阅 [PUT Object](https://docs.amazonaws.cn/AmazonS3/latest/API/RESTObjectPUT.html)。

### 使用 Amazon SDK
<a name="UploadInSingleOp"></a>

有关如何使用 Amazon SDK 上传对象的示例，请参阅《Amazon Simple Storage Service API 参考》**中的[代码示例](https://docs.amazonaws.cn/AmazonS3/latest/API/s3_example_s3_PutObject_section.html)。

有关使用不同 Amazon SDK 的一般信息，请参阅《Amazon Simple Storage Service API 参考》**中的[使用 Amazon SDK 通过 Amazon S3 进行开发](https://docs.amazonaws.cn/AmazonS3/latest/API/sdk-general-information-section.html)。

## 防止上传具有相同键名称的对象
<a name="upload-objects-with-same-key-name"></a>

在对上传操作使用有条件写入来创建对象之前，您可以检查存储桶中是否存在该对象。这样可以防止覆盖现有数据。当上传时，有条件写入将验证存储桶中尚不存在具有相同键名称的现有对象。

可以将有条件写入用于 [https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObject.html](https://docs.amazonaws.cn/AmazonS3/latest/API/API_PutObject.html) 或 [CompleteMultipartUpload](https://docs.amazonaws.cn/AmazonS3/latest/API/API_CompleteMultipartUpload.html) 请求。

有关有条件请求的更多信息，请参阅[使用有条件请求向 S3 操作添加前提条件](conditional-requests.md)。