Amazon Simple Storage Service
开发人员指南 (API Version 2006-03-01)
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

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

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

使用控制台

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

使用 AWS 开发工具包

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

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

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

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

Copy
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 代码示例

Copy
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 子资源。

    Copy
    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 或由它开头的对象。

Copy
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 开始的数据元

Copy
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=