

# 下载对象
<a name="download-objects"></a>

本部分介绍如何从 Amazon S3 存储桶下载对象。使用 Amazon S3，您将这些对象存储在一个或多个存储桶中，每个对象的大小最多为 50 TB。任何未归档的 Amazon S3 对象都可以实时访问。但对于已归档的对象，必须先进行还原，然后才能下载。有关下载归档对象的更多信息，请参阅[下载归档对象](#download-archived-objects)。

您可以使用 Amazon S3 控制台、AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API 下载单个对象。要从 S3 下载对象（最大为 5 TB）而无需编写任何代码或运行任何命令，请使用 S3 控制台。有关更多信息，请参阅 [下载对象](#download-an-object)。

要下载大于 5 TB 的对象，可使用并发 `GetObject` 请求和以下参数：使用 `Range` HTTP 标头来读取特定的字节范围，或者使用 `partNumber` 来下载对象的特定分段。单个 GET 请求限制为 5 TB，对于超过 5 TB 的 GET 请求，您将收到 `405 - Method Not Allowed` 错误。

要下载大型对象，请使用 Java v1/v2、Python 或 AWS CLI SDK 版本的 S3 Transfer Manager。要获得最佳性能，请将最新的 AWS 通用运行时（CRT）与这些 SDK 配合使用，该运行时已经过优化，可以提高资源利用率。CRT 会自动缩放各个 GET 的大小以优化吞吐量。您可以使用内存限制参数（例如，对于 Java SDK 为 `maxNativeMemoryLimitInBytes`）分配更多内存，从而提高总体传输吞吐量。您可以在下载请求中，使用请求参数（例如，对于 AWS CLI 为 `multipart_chunksize`，对于 Java SDK 为 `minimumPartSizeInBytes`）设置明确的分段大小来选择退出此行为。

要下载多个对象，请使用 AWS CloudShell、AWS CLI 或 AWS SDK。有关更多信息，请参阅 [下载多个对象](#download-multiple-objects)。

如果您需要下载对象的一部分，则需要将 AWS CLI 与额外的参数结合使用，或者使用 REST API 来仅指定要下载的字节。有关更多信息，请参阅 [下载对象的一部分](#download-objects-parts)。

如果您需要下载不属于您的对象，请让对象所有者生成一个允许您下载该对象的预签名 URL。有关更多信息，请参阅 [从另一个 AWS 账户下载对象](#download-objects-from-another-account)。

当您在 AWS 网络之外下载对象时，将收取数据传输费用。在同一个 AWS 区域中，AWS 网络内部的数据传输免费，但任何 `GET` 请求都将收取费用。有关数据传输成本和数据检索费用的更多信息，请参阅 [Amazon S3 定价](https://aws.amazon.com/s3/pricing/)。

**Topics**
+ [下载对象](#download-an-object)
+ [下载多个对象](#download-multiple-objects)
+ [下载对象的一部分](#download-objects-parts)
+ [从另一个 AWS 账户下载对象](#download-objects-from-another-account)
+ [下载归档对象](#download-archived-objects)
+ [根据元数据下载对象](#download-objects-based-on-metadata)
+ [下载对象故障排查](#download-objects-troubleshooting)

## 下载对象
<a name="download-an-object"></a>

您可以使用 Amazon S3 控制台、AWS CLI、AWS SDK 或 REST API 下载单个对象。

### 使用 S3 控制台
<a name="download-objects-console"></a>

本部分介绍如何使用 Amazon S3 控制台从 S3 存储桶下载对象。

**注意**  
一次只能下载一个对象。
如果您使用 Amazon S3 控制台下载对象的键名以句点 (`.`) 结尾，则该句点将从下载对象的键名中删除。要保留所下载对象名称末尾的句点，您必须使用 AWS Command Line Interface（AWS CLI）、AWS SDK 或 Amazon S3 REST API。

**从 S3 存储桶下载对象**

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

1. 在左侧导航窗格中，选择**通用存储桶**或**目录存储桶**。

1. 在存储桶列表中，选择要从中下载对象的存储桶的名称。

    

1. 您可以使用以下任一方式从 S3 存储桶下载对象：
   + 选中对象旁边的复选框，然后选择**下载**。如果您要将对象下载到特定文件夹，请在**操作**菜单中，选择**下载为**。
   + 如果要下载对象的特定版本，请打开**显示版本**（位于搜索框旁边）。选中所需对象版本旁边的复选框，然后选择**下载**。如果您要将对象下载到特定文件夹，请在**操作**菜单中，选择**下载为**。

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

以下 `get-object` 示例将向您展示如何使用 AWS CLI 从 Amazon S3 下载对象。此命令从存储桶 `amzn-s3-demo-bucket1` 获取对象 `folder/my_image`。您必须包含 `outfile`，这是已下载对象的文件名，例如 `my_downloaded_image.jpg`。

```
aws s3api get-object --bucket amzn-s3-demo-bucket1 --key folder/my_image my_downloaded_image.jpg
```

有关更多信息和示例，请参阅 *AWS CLI 命令参考*中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html)。

### 使用 AWS SDK
<a name="download-object-sdk"></a>

有关如何使用 AWS SDK 下载对象的示例，请参阅《Amazon S3 API 参考》**中的 [Code examples](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_GetObject_section.html)。

有关使用不同 AWS SDK 的一般信息，请参阅《Amazon S3 API 参考》**中的 [Developing with Amazon S3 using the AWS SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/sdk-general-information-section.html)。

### 使用 REST API
<a name="download-object-rest"></a>

您可以使用 REST API 从 Amazon S3 中检索对象。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)。

## 下载多个对象
<a name="download-multiple-objects"></a>

您可以使用 AWS CloudShell、AWS CLI 或 AWS SDK 下载多个对象。

### 在 AWS 管理控制台中使用AWS CloudShell
<a name="download-objects-cloudshell"></a>

AWS CloudShell 是一个已经事先完成身份验证的浏览器式 Shell，您可以直接从 AWS 管理控制台启动它。

有关 AWS CloudShell 的更多信息，请参阅《AWS CloudShell User Guide》**中的[What is CloudShell?](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)。

**重要**  
使用 AWS CloudShell，您的主目录的存储空间最高为每个 AWS 区域 1 GB。因此，您无法将存储桶与总大小超过此数量的对象同步。有关更多限制，请参阅《AWS CloudShell User Guide》**中的 [eService quotas and restrictions](https://docs.aws.amazon.com/cloudshell/latest/userguide/limits.html)。

**使用 AWS CloudShell 下载对象**

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

1. 运行以下命令，将存储桶中的对象同步到 CloudShell。以下命令同步名为 `amzn-s3-demo-bucket1` 的存储桶中的对象，并在 CloudShell 中创建一个名为 `temp` 的文件夹。CloudShell 会将您的对象同步到这个文件夹。要使用此命令，请将 `user input placeholders` 替换为您自己的信息。

   ```
   aws s3 sync s3://amzn-s3-demo-bucket1 ./temp
   ```
**注意**  
`sync` 命令与目录存储桶不兼容。  
要执行模式匹配以排除或包含特定对象，您可以在 `sync` 命令中使用 `--exclude "value"` 和 `--include "value"` 参数。

1. 运行以下命令，将名为 `temp` 的文件夹中的对象压缩到名为 `temp.zip` 的文件中。

   ```
   zip temp.zip -r temp/
   ```

1. 选择**操作**，然后选择**下载文件**。

1. 输入文件名 `temp.zip`，然后选择**下载**。

1. （可选）删除同步到 CloudShell 中 `temp` 文件夹的 `temp.zip` 文件和对象。使用 AWS CloudShell，您可在每个 AWS 区域中拥有最高 1 GB 的持久性存储。

   您可以使用此示例命令来删除您的 `.zip` 文件和文件夹。要使用此示例命令，请将 `user input placeholders` 替换为您自己的信息。

   ```
   rm temp.zip && rm -rf temp/
   ```

### 使用 AWS CLI
<a name="download-objects-cli"></a>

此示例说明如何使用 AWS CLI 下载指定目录或前缀下的所有文件或对象。此命令将存储桶 `amzn-s3-demo-bucket1` 中的所有对象复制到您的当前目录。要使用此示例命令，请使用您的存储桶名称代替 `amzn-s3-demo-bucket1`。

```
aws s3 cp s3://amzn-s3-demo-bucket1 . --recursive
```

以下命令将存储桶 `amzn-s3-demo-bucket1` 中前缀 `logs` 下的所有对象下载到您的当前目录。它还使用 `--exclude` 和 `--include` 参数仅复制带有后缀 `.log` 的对象。要使用此示例命令，请将 `user input placeholders` 替换为您自己的信息。

```
aws s3 cp s3://amzn-s3-demo-bucket1/logs/ . --recursive --exclude "*" --include "*.log"
```

有关更多信息和示例，请参阅 *AWS CLI 命令参考*中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html)。

### 使用 AWS SDK
<a name="download-objects-sdks"></a>

有关如何使用 AWS SDK 下载 Amazon S3 存储桶中所有对象的示例，请参阅《Amazon S3 API 参考》**中的 [Code examples](https://docs.aws.amazon.com/AmazonS3/latest/API/s3_example_s3_DownloadBucketToDirectory_section.html)。

有关使用不同 AWS SDK 的一般信息，请参阅《Amazon S3 API 参考》**中的 [Developing with Amazon S3 using the AWS SDKs](https://docs.aws.amazon.com/AmazonS3/latest/API/sdk-general-information-section.html)。

## 下载对象的一部分
<a name="download-objects-parts"></a>

您可以使用 AWS CLI 或 REST API 下载对象的一部分。为此，您需要使用额外的参数来指定要下载对象的哪一部分。

### 使用 AWS CLI
<a name="download-objects-part-cli"></a>

以下示例命令在名为 `amzn-s3-demo-bucket1` 的存储桶中，对名为 `folder/my_data` 的对象中的字节范围执行 `GET` 请求。在请求中，字节范围必须以 `bytes=` 为前缀。部分对象将下载到名为 `my_data_range` 的输出文件中。要使用此示例命令，请将 `user input placeholders` 替换为您自己的信息。

```
aws s3api get-object --bucket amzn-s3-demo-bucket1 --key folder/my_data --range bytes=0-500 my_data_range
```

有关更多信息和示例，请参阅 *AWS CLI 命令参考*中的 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/get-object.html)。

有关 HTTP `Range` 标头的更多信息，请参阅 RFC 编辑器网站上的 [RFC 9110](https://www.rfc-editor.org/rfc/rfc9110.html#name-range)。

**注意**  
Amazon S3 不支持在单个 `GET` 请求中检索多个数据范围。

### 使用 REST API
<a name="download-objects-part-rest"></a>

您可以在 REST API 中使用 `partNumber` 和 `Range` 参数，从 Amazon S3 检索对象部分。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)。

## 从另一个 AWS 账户下载对象
<a name="download-objects-from-another-account"></a>

您可以使用预签名 URL 授予对对象的限时访问权限，而不更新存储桶策略。

预签名 URL 可以在浏览器中输入，或者由程序用来下载对象。URL 使用的凭证是生成该 URL 的 AWS 用户的凭证。创建 URL 后，在该 URL 过期之前，任何拥有预签名 URL 的人都可以下载相应的对象。

### 在 S3 控制台中使用预签名 URL
<a name="download-objects-presigned"></a>

您可以使用 Amazon S3 控制台，按照以下步骤生成预签名 URL 来共享通用存储桶中的对象。使用控制台时，预签名 URL 的最长过期时间为自创建时起 12 小时。

**使用 Amazon S3 控制台生成预签名 URL**

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

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

1. 在存储桶列表中，选择包含要为其生成预签名 URL 的对象的存储桶的名称。

1. 在 **Objects**（对象）列表中，选择要为其生成预签名 URL 的对象。

1. 在**对象操作**菜单上，请选择**使用预签名 URL 共享**。

1. 指定您希望的预签名 URL 有效时间长度。

1. 请选择 **Create presigned URL**（创建预签名 URL）。

1. 出现确认消息时，URL 将自动复制到剪贴板。如果您需要再次复制预签名 URL，您将看到一个按钮，用于复制该 URL。

1. 要下载对象，请将 URL 粘贴到任何浏览器中，此时机会尝试下载该对象。

有关预签名 URL 和其他创建预签名 URL 方法的更多信息，请参阅[使用预签名 URL 下载和上传对象](using-presigned-url.md)。

## 下载归档对象
<a name="download-archived-objects"></a>

要降低不经常访问的对象的存储成本，您可以对此类对象进行*归档*。当您归档对象时，它会被移动到低成本存储中，这意味着您无法实时访问它。要下载归档对象，您必须先还原该对象。

根据存储类的不同，您可以在几分钟或几小时内还原归档对象。您可以使用 Amazon S3 控制台、S3 批量操作、Amazon S3 REST API、AWS SDK 和 AWS Command Line Interface（AWS CLI）还原归档的对象。

有关说明，请参阅[恢复已归档的对象](restoring-objects.md)。您可在还原归档对象后下载它。

## 根据元数据下载对象
<a name="download-objects-based-on-metadata"></a>

可以使用有条件读取请求添加前提条件，来根据对象的元数据下载该对象。可以根据对象的实体标签（ETag）或上次修改日期返回该对象。这可以将 S3 操作限制为自指定日期以来更新的对象，或者仅返回特定的对象版本。

可以将有条件写入用于 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html) 或 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html) 请求。

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

## 下载对象故障排查
<a name="download-objects-troubleshooting"></a>

当您尝试从 Amazon S3 下载对象时，权限不足、错误的存储桶或错误的 AWS Identity and Access Management（IAM）用户策略会导致出错。这些问题通常会导致访问被拒绝（403 禁止）错误，此时 Amazon S3 会禁止访问资源。

有关拒绝访问（403 禁止）错误的常见原因，请参阅[排查 Amazon S3 中的拒绝访问（403 Forbidden）错误](troubleshoot-403-errors.md)。

如果您在尝试访问对象时遇到 404 NoSuchKey 错误，请参阅 AWS re:Post 知识中心中的[如何对来自 Amazon S3 的 404 NoSuchKey 错误进行故障排除？](https://repost.aws/knowledge-center/404-error-nosuchkey-s3)