Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

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

此部分提供从启用版本控制的存储桶列出对象版本的示例。Amazon S3 在与存储桶关联的 versions 子资源 (请参阅存储桶配置选项) 中存储对象版本信息。

使用控制台

有关在控制台中列出对象版本的信息,请参阅如何查看 S3 对象的版本? (在 Amazon Simple Storage Service 控制台用户指南 中)。

使用 AWS 开发工具包

此部分中的代码示例从启用了版本控制的存储桶检索对象列表。每个请求最多返回 1000 个版本。如果您有更多版本,则需要发送一系列请求才能检索所有版本的列表。为了说明分页的工作原理,代码示例将响应限制为两个对象版本。如果存储桶中有两个以上的对象版本,则响应会返回值为“true”的 IsTruncated 元素,并包含 NextKeyMarkerNextVersionIdMarker 元素 (可以使用其值检索下一组对象键)。代码示例在后续请求中包含这些值以检索下一组对象。

有关使用其他 AWS 开发工具包的信息,请参阅示例代码和库

使用适用于 Java 的 AWS 开发工具包

有关如何创建和测试有效示例的信息,请参阅 测试 Java 代码示例

import java.io.IOException; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ListVersionsRequest; import com.amazonaws.services.s3.model.S3VersionSummary; import com.amazonaws.services.s3.model.VersionListing; public class ListKeysVersionEnabledBucket { private static String bucketName = "*** bucket name ***"; public static void main(String[] args) throws IOException { AmazonS3 s3client = new AmazonS3Client(new ProfileCredentialsProvider()); try { System.out.println("Listing objects"); ListVersionsRequest request = new ListVersionsRequest() .withBucketName(bucketName) .withMaxResults(2); // you can specify .withPrefix to obtain version list for a specific object or objects with // the specified key prefix. VersionListing versionListing; do { versionListing = s3client.listVersions(request); for (S3VersionSummary objectSummary : versionListing.getVersionSummaries()) { System.out.println(" - " + objectSummary.getKey() + " " + "(size = " + objectSummary.getSize() + ")" + "(versionID= " + objectSummary.getVersionId() + ")"); } request.setKeyMarker(versionListing.getNextKeyMarker()); request.setVersionIdMarker(versionListing.getNextVersionIdMarker()); } while (versionListing.isTruncated()); } catch (AmazonServiceException ase) { System.out.println("Caught an AmazonServiceException, " + "which means your request made it " + "to Amazon S3, but was rejected with an error response " + "for some reason."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException, " + "which means the client encountered " + "an internal error while trying to communicate" + " with S3, " + "such as not being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); } } }

使用适用于 .NET 的 AWS 开发工具包

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

using System; using Amazon.S3; using Amazon.S3.Model; namespace s3.amazon.com.docsamples { class ListObjectsVersioningEnabledBucket { static string bucketName = "*** bucket name ***"; public static void Main(string[] args) { using (var client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1)) { Console.WriteLine("Listing objects stored in a bucket"); GetObjectListWithAllVersions(client); } Console.WriteLine("Press any key to continue..."); Console.ReadKey(); } static void GetObjectListWithAllVersions(IAmazonS3 client) { 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 = client.ListVersions(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 amazonS3Exception) { if (amazonS3Exception.ErrorCode != null && (amazonS3Exception.ErrorCode.Equals("InvalidAccessKeyId") || amazonS3Exception.ErrorCode.Equals("InvalidSecurity"))) { Console.WriteLine("Check the provided AWS Credentials."); Console.WriteLine( "To sign up for service, go to http://aws.amazon.com/s3"); } else { Console.WriteLine( "Error occurred. Message:'{0}' when listing objects", amazonS3Exception.Message); } } } } }

使用 REST API

要列出存储桶中全部对象的所有版本,请在 GET Bucket 请求中使用 versions 子资源。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=

检索存储桶中对象的子集

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

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

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

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

示例 1:仅检索特定对象的所有版本

您可以通过以下过程,使用 versions 子资源和 prefix 请求参数检索某对象的所有版本。有关 prefix 的更多信息,请参阅 GET Bucket

检索键的所有版本

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

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

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=

您可以使用其他请求参数来检索对象的所有版本的子集。有关更多信息,请参阅 GET Bucket

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

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

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

检索满足原始 GET 请求的其他响应

1 key-marker 的值设置为在上一个响应中的 NextKeyMarker 中返回的键。
2 version-id-marker 的值设置为在上一个响应中的 NextVersionIdMarker 中返回的版本 ID。
3 使用 key-markerversion-id-marker 发送 GET Bucket versions 请求。

例 检索从指定的密钥和版本 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=