如何在Amazon S3存储桶中列出_all_对象?

use*_*528 29 c# amazon-s3 amazon-web-services

S3Client.ListObjects仅返回1000个对象.如何使用Amazon C#库检索所有现有对象的列表?

Ste*_*pel 63

如前所述,Amazon S3确实需要使用AWS SDK for .NET列出密钥:

由于存储桶可以包含几乎无限数量的密钥,因此列表查询的完整结果可能非常大.为了管理大型结果集,Amazon S3使用分页将它们拆分为多个响应.每个列表键响应返回一个最多1,000个键的页面,其中有一个指示符,指示响应是否被截断.您发送一系列列表键请求,直到您收到所有键.

提到的指标是ObjectsResponse类NextMarker属性- 它的用法在使用AWS SDK for .NET的完整示例列表键中说明,相关片段为:

static AmazonS3 client;
client = Amazon.AWSClientFactory.CreateAmazonS3Client(
                    accessKeyID, secretAccessKeyID);

ListObjectsRequest request = new ListObjectsRequest();
request.BucketName = bucketName;
do
{
   ListObjectsResponse response = client.ListObjects(request);

   // Process response.
   // ...

   // If response is truncated, set the marker to get the next 
   // set of keys.
   if (response.IsTruncated)
   {
        request.Marker = response.NextMarker;
   }
   else
   {
        request = null;
   }
} while (request != null);
Run Code Online (Sandbox Code Playgroud)

  • 您的第二个链接现已中断(通过多页结果迭代),可在此处找到:http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingNetSDK.html (2认同)

小智 10

请注意,上面的答案并未使用推荐的API来列出对象:http://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html

以下代码段显示了新API的外观:

using (var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
{
    ListObjectsV2Request request = new ListObjectsV2Request
    {
          BucketName = bucketName,
          MaxKeys = 10
    };
    ListObjectsV2Response response;
    do
    {
         response = await s3Client.ListObjectsV2Async(request);

         // Process response.
         // ...

         request.ContinuationToken = response.NextContinuationToken;

    } while (response.IsTruncated);        
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您喜欢无限循环,请复制并粘贴此代码 (3认同)
  • 为什么这会是一个无限循环?S3里不会有无限物品吧? (3认同)