

# GetObject（SOAP API）
<a name="SOAPGetObject"></a>

**注意**  
 Amazon S3 的 SOAP API 不适用于新客户，并将于 2025 年 8 月 31 日接近使用寿命终止（EOL）。我们建议您使用 REST API 或 Amazon SDK。

`GetObject` 操作返回对象的当前版本。如果您尝试对以删除标记作为其当前版本的对象执行 `GetObject`，S3 将返回 404 错误。您不能使用 SOAP API 来检索对象的指定版本。要执行这一操作，请使用 REST API。有关更多信息，请参阅[版本控制](https://docs.amazonaws.cn/AmazonS3/latest/userguide/Versioning.html)。有关更多选项，请使用 [GetObjectExtended（SOAP API）](SOAPGetObjectExtended.md)操作。

**注意**  
对于[虚拟托管类型请求](https://docs.amazonaws.cn/AmazonS3/latest/userguide/VirtualHosting.html#virtual-hosted-style-access)，不支持值为“soap”的对象键名称。对于使用“soap”的对象键名称值，必须改用[路径类型 URL](https://docs.amazonaws.cn//AmazonS3/latest/userguide/VirtualHosting.html#path-style-access)。

**Example**  
本示例从“quotes”存储桶获取“Nelson”对象。  
`Sample Request`  

```
 1. <GetObject xmlns="https://doc.s3.amazonaws.com/2006-03-01">
 2.   <Bucket>quotes</Bucket>
 3.   <Key>Nelson</Key>
 4.   <GetMetadata>true</GetMetadata>
 5.   <GetData>true</GetData>
 6.   <InlineData>true</InlineData>
 7.   <AWSAccessKeyId>AKIAIOSFODNN7EXAMPLE</AWSAccessKeyId>
 8.   <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
 9.   <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
10. </GetObject>
```
`Sample Response`  

```
 1. <GetObjectResponse xmlns="https://s3.amazonaws.com/doc/2006-03-01">
 2.   <GetObjectResponse>
 3.     <Status>
 4.       <Code>200</Code>
 5.       <Description>OK</Description>
 6.     </Status>
 7.     <Metadata>
 8.       <Name>Content-Type</Name>
 9.       <Value>text/plain</Value>
10.     </Metadata>
11.     <Metadata>
12.       <Name>family</Name>
13.       <Value>Muntz</Value>
14.     </Metadata>
15.     <Data>aGEtaGE=</Data>
16.     <LastModified>2006-01-01T12:00:00.000Z</LastModified>
17.     <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
18.   </GetObjectResponse>
19. </GetObjectResponse>
```

## 元素
<a name="SOAPGetObjectElements"></a>
+ `Bucket:` 要从中检索对象的存储桶。
+ `Key:` 用于标识对象的键。
+ `GetMetadata:` 如果为 true，则元数据将随对象一起返回。
+ `GetData:` 如果为 true，则返回对象数据。
+ `InlineData:` 如果为 true，则以 base 64 编码的数据将作为响应的 SOAP 正文的一部分返回。如果为 false，则数据作为 SOAP 附件返回。InlineData 选项不适合用于大型对象。系统将此操作限制为处理 1 MB 或更小的数据。如果生成的 Data 参数编码后的大小超过 1 MB，则设置了 InlineData 标志的 GetObject 请求将失败并显示 `InlineDataTooLargeError` 状态代码。要下载大型对象，请考虑在不设置 InlineData 标志的情况下调用 GetObject，或者改用 REST API。

## 返回的元素
<a name="SOAPGetObjectReturnedElements"></a>
+ `Metadata:` 随对象一起存储的名称-值对元数据。
+ `Data:` 如果请求中 InlineData 为 true，则它包含以 base 64 编码的对象数据。
+ `LastModified:` 在 Amazon S3 中存储对象的时间。
+ `ETag:` 对象的实体标签。这是对象的哈希值，可用于执行有条件获取。ETag 仅反映对于对象内容的更改，而不反映对其元数据的更改。

## 访问控制
<a name="SOAPGetObjectAccessControl"></a>

仅当被授予对象的 `READ` 访问权限后，您才能读取该对象。

## SOAP 分块下载和可恢复下载
<a name="SOAPResumableDownloads"></a>

为了提供 `GET` 灵活性，Amazon S3 支持分块下载和可恢复下载。

从以下各项中进行选择：
+ 对于大型对象下载，您可能希望将其分成较小的分块。有关更多信息，请参阅 [Range GET](#SOAPRangeGETs)。
+ 对于失败的 `GET` 操作，您可以将应用程序设计为下载剩余内容而不是整个文件。有关更多信息，请参阅 [REST GET 错误恢复](#SOAPGETErrorRecovery)。

### Range GET
<a name="SOAPRangeGETs"></a>

对于某些客户端，您可能希望将大型下载分解为若干较小的下载。要将 GET 分解成较小的单位，请使用 Range。

在将 GET 分解为较小的单位之前，必须确定其大小。例如，以下请求获取大文件对象的大小。

```
1. <ListBucket xmlns="https://doc.s3.amazonaws.com/2006-03-01">
2.   <Bucket>bigbucket</Bucket>
3.   <Prefix>bigfile</Prefix>
4.   <MaxKeys>1</MaxKeys>
5.   <AWSAccessKeyId>AKIAIOSFODNN7EXAMPLE</AWSAccessKeyId>
6.   <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
7.   <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
8. </ListBucket>
```

Amazon S3 返回以下响应。

```
 1. <ListBucketResult xmlns="https://s3.amazonaws.com/doc/2006-03-01">
 2.   <Name>quotes</Name>
 3.   <Prefix>N</Prefix>
 4.   <MaxKeys>1</MaxKeys>
 5.   <IsTruncated>false</IsTruncated>
 6.   <Contents>
 7.     <Key>bigfile</Key>
 8.     <LastModified>2006-01-01T12:00:00.000Z</LastModified>
 9.     <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
10.     <Size>2023276</Size>
11.     <StorageClass>STANDARD</StorageClass>
12.     <Owner>
13.       <ID>bcaf1ffd86f41161ca5fb16fd081034f</ID>
14.       <DisplayName>bigfile</DisplayName>
15.      </Owner>
16.   </Contents>
17. </ListBucketResult>
```

以下是从大文件对象下载第一个兆字节的请求。

```
 1. <GetObject xmlns="https://doc.s3.amazonaws.com/2006-03-01">
 2.   <Bucket>bigbucket</Bucket>
 3.   <Key>bigfile</Key>
 4.   <GetMetadata>true</GetMetadata>
 5.   <GetData>true</GetData>
 6.   <InlineData>true</InlineData>
 7.   <ByteRangeStart>0</ByteRangeStart>
 8.   <ByteRangeEnd>1048576</ByteRangeEnd>
 9.   <AWSAccessKeyId>AKIAIOSFODNN7EXAMPLE</AWSAccessKeyId>
10.   <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
11.   <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
12. </GetObject>
```

Amazon S3 返回文件的第一个兆字节和文件的 Etag。

```
 1. <GetObjectResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
 2.   <GetObjectResponse>
 3.     <Status>
 4.       <Code>200</Code>
 5.       <Description>OK</Description>
 6.     </Status>
 7.     <Metadata>
 8.       <Name>Content-Type</Name>
 9.       <Value>text/plain</Value>
10.     </Metadata>
11.     <Metadata>
12.       <Name>family</Name>
13.       <Value>Muntz</Value>
14.     </Metadata>
15.     <Data>--first megabyte of bigfile--</Data>
16.     <LastModified>2006-01-01T12:00:00.000Z</LastModified>
17.     <ETag>"828ef3fdfa96f00ad9f27c383fc9ac7f"</ETag>
18.   </GetObjectResponse>
19. </GetObjectResponse>
```

要确保文件在下载前面的部分后不会更改，请指定 IfMatch 元素。尽管 IfMatch 元素不是必需的，但对于可能发生变化的内容，建议使用该元素。

以下是使用 IfMatch 请求标头获取文件剩余部分的请求。

```
 1. <GetObject xmlns="https://doc.s3.amazonaws.com/2006-03-01">
 2.   <Bucket>bigbucket</Bucket>
 3.   <Key>bigfile</Key>
 4.   <GetMetadata>true</GetMetadata>
 5.   <GetData>true</GetData>
 6.   <InlineData>true</InlineData>
 7.   <ByteRangeStart>10485761</ByteRangeStart>
 8.   <ByteRangeEnd>2023276</ByteRangeEnd>
 9.   <IfMatch>"828ef3fdfa96f00ad9f27c383fc9ac7f"</IfMatch>
10.   <AWSAccessKeyId>AKIAIOSFODNN7EXAMPLE</AWSAccessKeyId>
11.   <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
12.   <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
13. </GetObject>
```

Amazon S3 将返回以下响应和文件的剩余部分。

```
 1. <GetObjectResponse xmlns="http://s3.amazonaws.com/doc/2006-03-01">
 2.   <GetObjectResponse>
 3.     <Status>
 4.       <Code>200</Code>
 5.       <Description>OK</Description>
 6.     </Status>
 7.     <Metadata>
 8.       <Name>Content-Type</Name>
 9.       <Value>text/plain</Value>
10.     </Metadata>
11.     <Metadata>
12.       <Name>family</Name>
13.       <Value>>Muntz</Value>
14.     </Metadata>
15.     <Data>--remainder of bigfile--</Data>
16.     <LastModified>2006-01-01T12:00:00.000Z</LastModified>
17.     <ETag>"828ef3fdfa96f00ad9f27c383fc9ac7f"</ETag>
18.   </GetObjectResponse>
19. </GetObjectResponse>
```

### 受版本控制的 GetObject
<a name="SOAPResumableDownloads-versioned-getobject"></a>

以下请求返回存储桶中对象的指定版本。

```
 1. <GetObject xmlns="https://doc.s3.amazonaws.com/2006-03-01">
 2. <Bucket>quotes</Bucket>
 3. <Key>Nelson</Key>
 4. <GetMetadata>true</GetMetadata>
 5. <GetData>true</GetData>
 6. <InlineData>true</InlineData>
 7. <AWSAccessKeyId>AKIAIOSFODNN7EXAMPLE</AWSAccessKeyId>
 8. <Timestamp>2006-03-01T12:00:00.183Z</Timestamp>
 9. <Signature>Iuyz3d3P0aTou39dzbqaEXAMPLE=</Signature>
10. </GetObject>
```

示例响应

```
 1. <GetObjectResponse xmlns="https://s3.amazonaws.com/doc/2006-03-01">
 2. <GetObjectResponse>
 3. <Status>
 4. <Code>200</Code>
 5. <Description>OK</Description>
 6. </Status>
 7. <Metadata>
 8. <Name>Content-Type</Name>
 9. <Value>text/plain</Value>
10. </Metadata>
11. <Metadata>
12. <Name>family</Name>
13. <Value>Muntz</Value>
14. </Metadata>
15. <Data>aGEtaGE=</Data>
16. <LastModified>2006-01-01T12:00:00.000Z</LastModified>
17. <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
18. </GetObjectResponse>
19. </GetObjectResponse>
```

### REST GET 错误恢复
<a name="SOAPGETErrorRecovery"></a>

如果对象 GET 失败，则可以通过指定要下载的范围来获取文件的剩余部分。为此，必须使用 `ListBucket` 获取对象的大小，并对文件的剩余部分执行 Range `GET`。有关更多信息，请参阅 [GetObjectExtended（SOAP API）](SOAPGetObjectExtended.md)。

### 相关资源
<a name="SOAPGettingObjectsRelatedTopics"></a>

[针对对象的操作（SOAP API）](SOAPObjectsOps.md)