

# 列出启用版本控制的存储桶中的对象
<a name="list-obj-version-enabled-bucket"></a>

此部分提供从启用版本控制的存储桶列出对象版本的示例。Amazon S3 将对象版本信息存储在与存储桶关联的 *versions* 子资源中。有关更多信息，请参阅 [通用存储桶配置选项](UsingBucket.md#bucket-config-options-intro)。要列出已启用版本控制的存储桶中的对象，您需要 `ListBucketVersions` 权限。

## 使用 S3 控制台
<a name="view-object-versions"></a>

请按照以下步骤使用 Amazon S3 控制台查看对象的不同版本。

**查看对象的多个版本**

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

1. 在**存储桶**列表中，请选择包含对象的存储桶的名称。

1. 要查看存储桶中对象的版本列表，请选择**显示版本**开关。

   控制台会显示每个对象版本的唯一版本 ID、对象版本的创建日期和时间以及其他属性。（在您设置版本控制状态之前存储在存储桶中的对象具有版本 ID **null**。）

   要列出没有版本的对象，请选择 **List versions (列出版本)** 开关。

您也可以在控制台中的对象概述面板中查看、下载和删除对象版本。有关更多信息，请参阅 [在 Amazon S3 控制台中查看对象属性](view-object-properties.md)。

**注意**  
 要访问早于 300 个版本的对象版本，必须使用 AWS CLI 或对象的 URL。

**重要**  
仅当对象已作为最新（当前）版本删除时，您才能取消删除它。您无法取消删除已删除对象的早期版本。有关更多信息，请参阅 [使用 S3 版本控制保留对象的多个版本](Versioning.md)。

## 使用 AWS SDK
<a name="list-obj-version-enabled-bucket-sdk-examples"></a>

此部分中的示例说明了如何从启用了版本控制的存储桶中检索对象列表。每个请求最多返回 1000 个版本，除非您指定一个较小的数字。如果存储桶包含的版本数超过此限制，请发送一系列请求来检索所有版本的列表。以“页面”形式返回结果的过程称为*分页*。

为了说明分页的工作原理，该示例将每个响应限制为两个对象版本。在检索第一页结果后，每个示例将检查以确定版本列表是否已被截断。如果是，示例将继续检索页面，直至检索到所有版本。

**注意**  
以下示例还使用未启用版本控制的存储桶或用于没有单独版本的对象。在这些情况下，Amazon S3 将返回版本 ID 为 `null` 的对象列表。

 有关使用其他 AWS SDK 的信息，请参阅 [AWS 开发人员中心](https://aws.amazon.com/code/)。

------
#### [ Java ]

有关创建和测试有效示例的说明，请参阅《适用于 Java 的 AWS SDK 开发人员指南》中的[入门](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/getting-started.html)。

```
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
import com.amazonaws.auth.profile.ProfileCredentialsProvider;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.ListVersionsRequest;
import com.amazonaws.services.s3.model.S3VersionSummary;
import com.amazonaws.services.s3.model.VersionListing;

public class ListKeysVersioningEnabledBucket {

    public static void main(String[] args) {
        Regions clientRegion = Regions.DEFAULT_REGION;
        String bucketName = "*** Bucket name ***";

        try {
            AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new ProfileCredentialsProvider())
                    .withRegion(clientRegion)
                    .build();

            // Retrieve the list of versions. If the bucket contains more versions
            // than the specified maximum number of results, Amazon S3 returns
            // one page of results per request.
            ListVersionsRequest request = new ListVersionsRequest()
                    .withBucketName(bucketName)
                    .withMaxResults(2);
            VersionListing versionListing = s3Client.listVersions(request);
            int numVersions = 0, numPages = 0;
            while (true) {
                numPages++;
                for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) {
                    System.out.printf("Retrieved object %s, version %s\n",
                            objectSummary.getKey(),
                            objectSummary.getVersionId());
                    numVersions++;
                }
                // Check whether there are more pages of versions to retrieve. If
                // there are, retrieve them. Otherwise, exit the loop.
                if (versionListing.isTruncated()) {
                    versionListing = s3Client.listNextBatchOfVersions(versionListing);
                } else {
                    break;
                }
            }
            System.out.println(numVersions + " object versions retrieved in " + numPages + " pages");
        } catch (AmazonServiceException e) {
            // The call was transmitted successfully, but Amazon S3 couldn't process
            // it, so it returned an error response.
            e.printStackTrace();
        } catch (SdkClientException e) {
            // Amazon S3 couldn't be contacted for a response, or the client
            // couldn't parse the response from Amazon S3.
            e.printStackTrace();
        }
    }
}
```

------
#### [ .NET ]

有关设置和运行代码示例的信息，请参阅《适用于 .NET 的 AWS SDK 开发人员指南》**中的[适用于 .NET 的 AWS SDK 入门](https://docs.aws.amazon.com/sdk-for-net/latest/developer-guide/net-dg-setup.html)。

```
using Amazon;
using Amazon.S3;
using Amazon.S3.Model;
using System;
using System.Threading.Tasks;

namespace Amazon.DocSamples.S3
{
    class ListObjectsVersioningEnabledBucketTest
    {
        static string bucketName = "*** bucket name ***";
        // Specify your bucket region (an example region is shown).
        private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2;
        private static IAmazonS3 s3Client;

        public static void Main(string[] args)
        {
            s3Client = new AmazonS3Client(bucketRegion);
            GetObjectListWithAllVersionsAsync().Wait();
        }

        static async Task GetObjectListWithAllVersionsAsync()
        {
            try
            {
                ListVersionsRequest request = new ListVersionsRequest()
                {
                    BucketName = bucketName,
                    // You can optionally specify key name prefix in the request
                    // if you want list of object versions of a specific object.

                    // For this example we limit response to return list of 2 versions.
                    MaxKeys = 2
                };
                do
                {
                    ListVersionsResponse response = await s3Client.ListVersionsAsync(request); 
                    // Process response.
                    foreach (S3ObjectVersion entry in response.Versions)
                    {
                        Console.WriteLine("key = {0} size = {1}",
                            entry.Key, entry.Size);
                    }

                    // If response is truncated, set the marker to get the next 
                    // set of keys.
                    if (response.IsTruncated)
                    {
                        request.KeyMarker = response.NextKeyMarker;
                        request.VersionIdMarker = response.NextVersionIdMarker;
                    }
                    else
                    {
                        request = null;
                    }
                } while (request != null);
            }
            catch (AmazonS3Exception e)
            {
                Console.WriteLine("Error encountered on server. Message:'{0}' when writing an object", e.Message);
            }
            catch (Exception e)
            {
                Console.WriteLine("Unknown encountered on server. Message:'{0}' when writing an object", e.Message);
            }
        }
    }
}
```

------

## 使用 REST API
<a name="ListingtheObjectsinaVersioningEnabledBucket"></a>

**Example — 列出存储桶中的所有对象版本**  
要列出存储桶中所有对象的所有版本，请在 `versions` 请求中使用 `GET Bucket` 子资源。Amazon S3 最多能检索 1000 个对象，且每个对象版本都将计为一个完整的对象。因此，如果存储桶包含两个键（例如 `photo.gif` 和 `picture.jpg`），并且第一个键有 990 个版本，第二个键有 400 个版本，则单个请求将检索 `photo.gif` 的所有 990 个版本，另加 `picture.jpg` 的最近 10 个版本。  
Amazon S3 将按照存储的顺序返回对象版本，最先返回最近存储的版本。  
在 `GET Bucket` 请求中，包含 `versions` 子资源。  

```
1. GET /?versions HTTP/1.1
2. Host: bucketName.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 +0000
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

**Example — 检索键的所有版本**  
 要检索对象版本的子集，请为 `GET Bucket` 使用请求参数。有关更多信息，请参阅 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。  

1. 将 `prefix` 参数设置为您要检索的对象的键。

1. 使用 `GET Bucket` 子资源和 `versions` 发送 `prefix` 请求。

   `GET /?versions&prefix=objectName HTTP/1.1`

**Example — 使用前缀检索对象**  
以下示例将检索其键是 `myObject` 或由它开头的对象。  

```
1. GET /?versions&prefix=myObject HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```
您可以使用其他请求参数来检索对象的所有版本的子集。有关更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。

**Example — 在响应截断时检索其他对象的列表**  
如果可以在 `GET` 请求中返回的对象数量超过 `max-keys` 的值，则响应将包含 `<isTruncated>true</isTruncated>`，并包含满足该请求但不会返回的第一个键 (在 `NextKeyMarker` 中) 和第一个版本 ID (在 `NextVersionIdMarker` 中)。您可以在后续请求中将这些返回的值用作开始位置，以检索满足 `GET` 请求的其他对象。  
使用以下过程从存储桶中检索满足原始 `GET Bucket versions` 请求的其他对象。有关 `key-marker`、`version-id-marker`、`NextKeyMarker` 和 `NextVersionIdMarker` 的更多信息，请参阅《Amazon Simple Storage Service API 参考》**中的 [https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html)。  
以下是满足原始 `GET` 请求的其他响应：  
+ 将 `key-marker` 的值设置为在上一个响应中的 `NextKeyMarker` 中返回的键。
+ 将 `version-id-marker` 的值设置为在上一个响应中的 `NextVersionIdMarker` 中返回的版本 ID。
+ 使用 `GET Bucket versions` 和 `key-marker` 发送 `version-id-marker` 请求。

**Example — 检索以指定的键和版本 ID 开始的对象**  

```
1. GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1
2. Host: bucket.s3.amazonaws.com
3. Date: Wed, 28 Oct 2009 22:32:00 GMT
4. Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
```

## 使用 AWS CLI
<a name="list-obj-version-enabled-bucket-cli"></a>

以下命令返回有关存储桶中的对象的所有版本的元数据。

```
aws s3api list-object-versions --bucket amzn-s3-demo-bucket1
```

有关 `list-object-versions` 的更多信息，请参阅《AWS CLI 命令参考》**中的 [https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html](https://docs.aws.amazon.com/cli/latest/reference/s3api/list-object-versions.html)。