

# 如何使用有条件读取根据元数据检索或复制对象
<a name="conditional-reads"></a>

通过有条件读取，可以向读取请求中添加一个额外的标头，以便向 S3 操作添加前提条件。如果未满足这些前提条件，读取请求将失败。

可以对 `GET`、`HEAD` 或 `COPY` 请求使用有条件读取，以便仅根据对象的元数据返回该对象。

当您上传对象时，Amazon S3 将创建只能由 S3 修改的系统控制的元数据。实体标签（ETag）和 Last-Modified 是系统控制的元数据的示例。对象的 ETag 是一个字符串，表示对象的特定版本。Last-Modified 日期是元数据，表示对象的创建日期或上次修改日期（以较晚者为准）。

通过有条件读取，可以根据对象的 ETag 或 Last-Modified 日期返回该对象。可以在请求中指定 ETag 值，并且仅在 ETag 值匹配时才返回对象。这可以确保您只返回或复制对象的特定版本。可以在读取请求中指定 Last-Modified 值，并且仅当对象自您提供的日期以来已被修改时，才返回该对象。

## 支持的 API
<a name="conditional-read-apis"></a>

以下 S3 API 支持使用有条件读取：
+ [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)
+ [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)

可以使用以下标头来返回依赖于实体标签（ETag）或上次修改日期的对象。有关对象元数据（例如 ETag 和 Last-Modified）的更多信息，请参阅[系统定义的对象元数据](UsingMetadata.md#SysMetadata)。

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html)**  

+ `If-Match` — 仅当对象的 ETag 与提供的 ETag 匹配时，才返回该对象。
+ `If-Modified-Since` — 仅当对象自指定时间以来已被修改时，才返回该对象。
+ `If-None-Match` — 仅当对象的 ETag 与提供的 ETag 不匹配时，才返回该对象。
+ `If-Unmodified-Since` — 仅当对象自指定时间以来未被修改时，才返回该对象。

有关这些标头、返回的错误以及 S3 在单个请求中处理多个条件标头的顺序的更多信息，请参阅《Amazon Simple Storage Service API Reference》中的 [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)**  

+ `If-Match` — 仅当对象的 ETag 与提供的 ETag 匹配时，才返回该对象。
+ `If-Modified-Since` — 仅当对象自指定时间以来已被修改时，才返回该对象。
+ `If-None-Match` — 仅当对象的 ETag 与提供的 ETag 不匹配时，才返回该对象。
+ `If-Unmodified-Since` — 仅当对象自指定时间以来未被修改时，才返回该对象。

有关这些标头、返回的错误以及 S3 在单个请求中处理多个条件标头的顺序的更多信息，请参阅《Amazon Simple Storage Service API Reference》中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html)。

**[https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)**  

+ `x-amz-copy-source-if-match` — 仅当对象的 ETag 与提供的 ETag 匹配时，才复制源对象。
+ `x-amz-copy-source-if-modified-since` — 仅当对象自指定时间以来已被修改时，才复制源对象。
+ `x-amz-copy-source-if-none-match` — 仅当对象的 ETag 与提供的 ETag 不匹配时，才复制源对象。
+ `x-amz-copy-source-if-unmodified-since` — 仅当对象自指定时间以来未被修改时，才复制源对象。
+ `If-Match`：仅当对象的 ETag 与提供的 ETag 匹配时，才复制对象。`If-Match` 要求 ETag 值为字符串。
+ `If-None-Match`：仅当对象的 ETag 与提供的 ETag 不匹配时，才复制对象。`If-None-Match` 需要“\$1”（星号）字符。

有关这些标头、返回的错误以及 S3 在单个请求中处理多个条件标头的顺序的更多信息，请参阅《Amazon Simple Storage Service API Reference》中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html)。