

# 向目录存储桶中的对象追加数据
<a name="directory-buckets-objects-append"></a>

您可以将数据添加到存储在目录存储桶内 S3 Express One Zone 存储类中的现有对象的末尾。如果数据是在一段时间内连续写入的，或者如果您需要在写入对象的同时读取该对象，我们建议您使用向对象追加数据的功能。向对象追加数据对于一些应用场景很常见，例如，向日志文件添加新的日志条目，或在视频文件转码并流式传输时向其中添加新的视频片段等。通过向对象追加数据，您可以简化之前需要先在本地存储中合并数据然后再将最终对象复制到 Amazon S3 的应用程序。

可以追加到对象的数据没有最小大小要求。但是，您可以在单个请求中追加到对象的最大数据大小为 5 GB。这与使用任何 Amazon S3 API 上传数据时的最大请求大小限制相同。

每次成功的追加操作都将创建对象的一部分，每个对象最多可以有 10000 个部分。这意味着您最多可以向对象追加数据 10000 次。如果使用 S3 分段上传创建对象，那么每个上传的部分都会计入总计最多 10000 个部分的限制中。例如，对于通过分段上传创建的包含 1000 个部分的对象，您最多可以追加 9000 次。

**注意**  
 如果达到部分的限制数，您将收到 [TooManyParts](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html#API_PutObject_Errors) 错误。您可以使用 `CopyObject` API 来重置计数。

 如果您想将分段并行上传至对象，并且无需在上传分段时读取分段，我们建议您使用 Amazon S3 分段上传。有关更多信息，请参阅[使用分段上传](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-using-multipart-upload.html)。

仅支持向存储在 S3 Express One Zone 存储类中的目录存储桶内的对象追加数据。有关 S3 Express One Zone 的更多信息，请参阅[开始使用 S3 Express One Zone](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-getting-started.html)。

要开始向目录存储桶中的对象追加数据，您可以使用 AWS SDK、AWS CLI 和 `PutObject` API。当您发出 `PutObject` 请求时，您可以将 `x-amz-write-offset-bytes` 标头设置为要追加到的对象的大小。要使用 `PutObject` API 操作，您必须使用 `CreateSession` API 建立临时安全凭证，才能访问目录存储桶中的对象。有关更多信息，请参阅《Amazon S3 API Reference》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) 和 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html)。

每次成功的追加操作都会按 `PutObject` 请求计费。要了解有关定价的更多信息，请参阅 [https://aws.amazon.com/s3/pricing/](https://aws.amazon.com/s3/pricing/)。

**注意**  
从 1.12 版起，适用于 Amazon S3 的 Mountpoint 支持向存储在 S3 Express One Zone 中的对象追加数据。要开始使用，您必须通过设置 `--incremental-upload ` 标志来选择启用该功能。有关 Mountpoint 的更多信息，请参阅[使用 Mountpoint](https://docs.aws.amazon.com/AmazonS3/latest/userguide/mountpoint.html)。

 如果您在上传追加的数据时使用 CRC（循环冗余校验）算法，则可以使用 `HeadObject` 或 `GetObject` 请求来检索基于 CRC 的完整对象校验和。如果您在上传追加的数据时使用 SHA-1 或 SHA-256 算法，则可以检索追加部分的校验和，并使用之前的 PutObject 响应中返回的 SHA 校验和来验证其完整性。有关更多信息，请参阅[数据保护和加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-data-protection.html.html)。

## 使用 AWS CLI、AWS SDK 和 REST API 向对象追加数据
<a name="directory-bucket-append"></a>

您可以使用 AWS Command Line Interface（AWS CLI）、AWS SDK 和 REST API 将数据追加到您的对象中。

### 使用 AWS CLI
<a name="set-append--cli"></a>

以下 `put-object` 示例命令演示了如何使用 AWS CLI 将数据追加到对象。要运行此命令，请将*用户输入占位符*替换为您自己的信息。

```
aws s3api put-object --bucket amzn-s3-demo-bucket--azid--x-s3 --key sampleinput/file001.bin --body bucket-seed/file001.bin --write-offset-bytes size-of-sampleinput/file001.bin
```

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

------
#### [ SDK for Java ]

您可以使用 适用于 Java 的 AWS SDK 将数据追加到您的对象。

```
var putObjectRequestBuilder = PutObjectRequest.builder()
                                              .key(key)
                                              .bucket(bucketName)
                                              .writeOffsetBytes(9);
var response = s3Client.putObject(putObjectRequestBuilder.build());
```

------
#### [ SDK for Python ]

```
s3.put_object(Bucket='amzn-s3-demo-bucket--use2-az2--x-s3', Key='2024-11-05-sdk-test', Body=b'123456789', WriteOffsetBytes=9)
```

------

### 使用 REST API
<a name="directory-bucket-append-api"></a>

 您可以发送 REST 请求来将数据追加到对象。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html#API_PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html#API_PutObject)。