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

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

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

本节提供了从启用版本的磁带机列出对象版本的示例。 Amazon S3 将对象版本信息存储在 版本 子资源(参见 存储桶配置选项)与桶相关。

使用 控制台

有关列出对象版本的信息,请使用 Amazon S3 控制台,参见 如何看到S3对象的版本?Amazon Simple Storage Service 控制台用户指南.

使用 AWS 开发工具包

此部分中的示例说明了如何从启用了版本控制的存储桶中检索对象列表。每个请求最多返回 1000 个版本,除非您指定一个较小的数字。如果存储桶包含的版本数超过此限制,请发送一系列请求来检索所有版本的列表。在“页面”返回结果的过程称为“页面” 分页. 为了说明分页的工作原理,该示例将每个响应限制为两个对象版本。在检索第一页结果后,每个示例将检查以确定版本列表是否已被截断。如果是,示例将继续检索页面,直至检索到所有版本。

注意

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

有关使用其他AWSSDK的信息,请参阅 样本代码和库.

使用 AWS SDK for Java

有关创建和测试有效示例的说明,请参阅测试 Amazon S3 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 的 AWS 开发工具包

有关如何创建和测试有效示例的信息,请参阅 运行 Amazon S3 .NET 代码示例.

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

要列出桶中所有对象的所有版本,请使用 versions 子资源 GET Bucket 请求。 Amazon S3 可以仅检索1,000个对象的最大值,并且每个对象版本的数字都完全是对象。因此,如果桶中包含两个密钥(例如, photo.gifpicture.jpg),第一个密钥具有990个版本,第二个密钥具有400个版本,一个请求将检索所有990个版本的 photo.gif 只有最新的10个版本的 picture.jpg.

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=

检索存储桶中对象的子集

此部分讨论以下两个示例场景:

  • 您希望检索存储桶中所有对象版本的子集,例如检索特定对象的所有版本。

  • 响应中对象版本的数目超过 max-key 的值 (默认情况下为 1000),因此您必须再提交一个请求以检索其余的对象版本。

要检索对象版本的子集,请为 GET Bucket 使用请求参数。有关详细信息,请参阅 获取桶子.

示例 #1 检索只有特定对象的所有版本

您可以使用 versions 子资源和 prefix 请求参数使用以下过程。有关 prefix,参见 获取桶子.

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=

您可以使用其他请求参数来检索对象的所有版本的子集。有关详细信息,请参阅 获取桶子.

示例 2 如果响应被截断,检索其他对象列表

如果可以在 GET 请求超出了 max-keys,回答包含 <isTruncated>true</isTruncated>,并包括第一个密钥 NextKeyMarker)和第一个版本ID NextVersionIdMarker)满足请求,但未返回。您可以在后续请求中将这些返回的值用作开始位置,以检索满足 GET 请求的其他对象。

使用以下过程从存储桶中检索满足原始 GET Bucket versions 请求的其他对象。有关 key-markerversion-id-markerNextKeyMarker,和 NextVersionIdMarker,参见 获取桶子.

1 设置 key-marker 至返回的密钥 NextKeyMarker 在之前的回答中。
2 设置 version-id-marker 至返回的版本ID NextVersionIdMarker 在之前的回答中。
3 发送 GET Bucket versions 请求使用 key-markerversion-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=