

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 `S3CrtClient` 执行 Amazon S3 操作
<a name="examples-s3-crt"></a>

该`S3CrtClient`课程在 1.9 版中可用， 适用于 C\$1\$1 的 AWS SDK 它提高了向 Amazon S3 上传和下载大型数据文件的吞吐量。有关此版本改进的更多信息，请参阅[使用 适用于 C\$1\$1 的 AWS SDK v1.9 提高 Amazon S3 吞吐量](https://github.com/aws/aws-sdk-cpp/wiki/Improving-S3-Throughput-with-AWS-SDK-for-CPP-v1.9)

`S3CrtClient` 构建于 [AWS 通用运行时（CRT）库](https://docs.aws.amazon.com/sdkref/latest/guide/common-runtime.html)之上。

**注意**  
为避免因上传不完整或部分上传而产生费用，我们建议您在 Amazon S3 存储桶上启用[AbortIncompleteMultipartUpload](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpu-abort-incomplete-mpu-lifecycle-config.html)生命周期规则。  
该规则指示 Amazon S3 中止在启动后没有在指定天数内完成的分段上传。当超过设置的时间限制时，Amazon S3 将中止上传，然后删除未完成的上传数据。  
有关更多信息，请参阅《Amazon S3 用户指南》中的[在存储桶上设置生命周期配置](https://docs.aws.amazon.com/AmazonS3/latest/userguide/how-to-set-lifecycle-configuration-intro.html)。

## 先决条件
<a name="codeExamplePrereq"></a>

在开始之前，建议您先阅读[开始使用 适用于 C\$1\$1 的 AWS SDK](getting-started.md)。

下载示例代码并按[代码示例入门](getting-started-code-examples.md)中所述构建解决方案。

要运行这些示例，您的代码用于发出请求的用户配置文件必须具有适当的权限 AWS （适用于服务和操作）。有关更多信息，请参阅[提供 AWS 凭证](credentials.md)。

## 使用 `S3CrtClient` 上传和下载对象
<a name="stream"></a>

此示例演示如何使用 [https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3-crt/html/class_aws_1_1_s3_crt_1_1_s3_crt_client.html](https://docs.aws.amazon.com/sdk-for-cpp/latest/api/aws-cpp-sdk-s3-crt/html/class_aws_1_1_s3_crt_1_1_s3_crt_client.html)。该示例创建一个存储桶，上传一个对象，下载该对象，然后删除该文件和存储桶。PUT 操作会转化为分段上传。GET 操作会转化为多个“分范围”GET 请求。有关分段上传的更多信息，请参阅《Amazon S3 用户指南》中的[使用分段上传来上传和复制对象](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html)。

在此示例中，提供的数据文件 `ny.json` 以分段上传的形式上传。这一点可以在程序成功运行后，通过查看调试日志来确认。

如果上传失败，底层 CRT 库中会发出 `AbortMultipartUpload`，以清理所有已上传的部分。但是，并非所有错误/故障都可以在内部处理（例如拔掉网线）。建议您在 Amazon S3 存储桶上创建生命周期规则，以确保部分上传的数据不会滞留在您的账户中（部分上传的数据仍然会产生费用）。有关如何设置生命周期规则，请参阅[发现并删除未完成的分段上传以降低 Amazon S3 费用](https://aws.amazon.com/blogs/aws-cost-management/discovering-and-deleting-incomplete-multipart-uploads-to-lower-amazon-s3-costs/ )。

**使用调试日志浏览分段上传的详细信息**

1. 在 `main()` 函数中，注意带有“TODO”注释的代码，这些注释提供了更新代码的说明。

   1. 对于 `file_name`：从代码注释中提供的链接下载示例数据文件 `ny.json`，或使用您自己的大型数据文件。

   1. 对于`region`：使用枚举将`region`变量更新为账户 AWS 区域 的变量。要找到您的账户所在区域，请登录到 AWS 管理控制台，然后在右上角找到该区域。

1. 编译示例。

1. 将变量 `file_name` 指定的文件复制到您的可执行文件夹，然后运行 `s3-crt-demo` 可执行文件。

1. 在您的可执行文件夹中，找到最新的 `.log` 文件。

1. 打开日志文件，选择**搜索**，然后输入 **partNumber**。

1. 该日志包含类似以下内容的条目，其中为上传文件的每个部分指定了 `partNumber` 和 `uploadId`：

    `PUT /my-object partNumber=1&uploadId=gsk8vDbmnlA5EseDo._LDEgq22Qmt0SeuszYxMsZ9ABt503VqDIFOP8xzZI1P0zp.ToS.qo5kK16HNWogZF3KpRo.Dc7QnLZIK0BTmzCWwWoPax4T21hvP6nPdz9591F content-length:8388608 host:my-bucketasdfasdf.s3.us-east-2.amazonaws.com x-amz-content-sha256:UNSIGNED-PAYLOAD`

    and 

    `PUT /my-object partNumber=2&uploadId=gsk8vDbmnlA5EseDo._LDEgq22Qmt0SeuszYxMsZ9ABt503VqDIFOP8xzZI1P0zp.ToS.qo5kK16HNWogZF3KpRo.Dc7QnLZIK0BTmzCWwWoPax4T21hvP6nPdz9591F content-length:8388608 host:my-bucketasdfasdf.s3.us-east-2.amazonaws.com x-amz-content-sha256:UNSIGNED-PAYLOAD `

请参阅 [Github](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/cpp/example_code/s3-crt/s3-crt-demo.cpp) 上的完整示例。