列出启用版本控制的存储桶中的对象 - Amazon Simple Storage Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

列出启用版本控制的存储桶中的对象

此部分提供从启用版本控制的存储桶列出对象版本的示例。Amazon S3 将对象版本信息存储在与存储桶关联的 versions 子资源中。有关更多信息,请参阅 存储桶配置选项。要列出已启用版本控制的存储桶中的对象,您需要 ListBucketVersions 权限。

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

查看对象的多个版本
  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon S3 控制台:https://console.aws.amazon.com/s3/

  2. 存储桶列表中,请选择包含对象的存储桶的名称。

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

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

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

您也可以在控制台中的对象概述面板中查看、下载和删除对象版本。有关更多信息,请参阅 在 Amazon S3 控制台中查看对象属性

注意

要访问早于 300 个版本的对象版本,必须使用 Amazon CLI 或对象的 URL。

重要

仅当对象已作为最新(当前)版本删除时,您才能取消删除它。您无法取消删除已删除对象的早期版本。有关更多信息,请参阅 使用 S3 版本控制保留对象的多个版本

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

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

注意

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

有关使用其他 Amazon SDK 的信息,请参阅 Amazon 开发人员中心

Java

有关创建和测试有效示例的说明,请参阅《Amazon SDK for Java 开发人员指南》中的入门

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 的 Amazon SDK 开发人员指南》中的适用于 .NET 的 Amazon SDK 入门

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); } } } }
例 — 列出存储桶中的所有对象版本

要列出存储桶中所有对象的所有版本,请在 versions 请求中使用 GET Bucket 子资源。Amazon S3 最多能检索 1000 个对象,且每个对象版本都将计为一个完整的对象。因此,如果存储桶包含两个键(例如 photo.gifpicture.jpg),并且第一个键有 990 个版本,第二个键有 400 个版本,则单个请求将检索 photo.gif 的所有 990 个版本,另加 picture.jpg 的最近 10 个版本。

Amazon S3 将按照存储的顺序返回对象版本,最先返回最近存储的版本。

GET Bucket 请求中,包含 versions 子资源。

GET /?versions HTTP/1.1 Host: bucketName.s3.amazonaws.com Date: Wed, 28 Oct 2009 22:32:00 +0000 Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=
例 — 检索键的所有版本

要检索对象版本的子集,请为 GET Bucket 使用请求参数。有关更多信息,请参阅 GET Bucket

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

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

    GET /?versions&prefix=objectName HTTP/1.1

例 — 使用前缀检索对象

以下示例将检索其键是 myObject 或由它开头的对象。

GET /?versions&prefix=myObject HTTP/1.1 Host: bucket.s3.amazonaws.com Date: Wed, 28 Oct 2009 22:32:00 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=

您可以使用其他请求参数来检索对象的所有版本的子集。有关更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 GET Bucket

例 — 在响应截断时检索其他对象的列表

如果可以在 GET 请求中返回的对象数量超过 max-keys 的值,则响应将包含 <isTruncated>true</isTruncated>,并包含满足该请求但不会返回的第一个键 (在 NextKeyMarker 中) 和第一个版本 ID (在 NextVersionIdMarker 中)。您可以在后续请求中将这些返回的值用作开始位置,以检索满足 GET 请求的其他对象。

使用以下过程从存储桶中检索满足原始 GET Bucket versions 请求的其他对象。有关 key-markerversion-id-markerNextKeyMarkerNextVersionIdMarker 的更多信息,请参阅《Amazon Simple Storage Service API 参考》中的 GET Bucket

以下是满足原始 GET 请求的其他响应:

  • key-marker 的值设置为在上一个响应中的 NextKeyMarker 中返回的键。

  • version-id-marker 的值设置为在上一个响应中的 NextVersionIdMarker 中返回的版本 ID。

  • 使用 GET Bucket versionskey-marker 发送 version-id-marker 请求。

例 — 检索以指定的键和版本 ID 开始的对象
GET /?versions&key-marker=myObject&version-id-marker=298459348571 HTTP/1.1 Host: bucket.s3.amazonaws.com Date: Wed, 28 Oct 2009 22:32:00 GMT Authorization: AWS AKIAIOSFODNN7EXAMPLE:0RQf4/cRonhpaBX5sCYVf1bNRuU=

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

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

有关 list-object-versions 的更多信息,请参阅《Amazon CLI 命令参考》中的 list-object-versions