【问题标题】:How to list _all_ objects in Amazon S3 bucket?如何列出 Amazon S3 存储桶中的所有对象?
【发布时间】:2012-04-12 19:55:08
【问题描述】:

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

【问题讨论】:

    标签: c# amazon-s3 amazon-web-services


    【解决方案1】:

    如前所述,Amazon S3 确实需要Listing Keys Using the AWS SDK for .NET

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

    提到的指标是来自ObjectsResponse ClassNextMarker 属性 - 它的用法在完整示例Listing Keys Using the 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);
    

    【讨论】:

    • 两年多过去了,对我来说仍然是完美的解决方案!谢谢:)
    • 您的第二个链接现在已损坏(遍历多页结果),可以在此处找到:docs.aws.amazon.com/AmazonS3/latest/dev/…
    • 这将起作用,但同时使用请求作为请求和作为循环结束标记值(当为空时)似乎不是很好的做法。 (不是发帖人的错,因为这是亚马逊文档告诉你的。)
    • 你能看看这个链接并帮助我吗? github.com/kamalababuhanchinal/aws-s3-objects@SteffenOpel
    【解决方案2】:

    根据文档,客户在您描述的情况下使用分页。根据文档,您应该在结果上使用IsTruncated...如果是true,则再次调用ListObjects,并正确设置Marker以获取下一页等-当IsTruncated返回false时停止调用.

    【讨论】:

      【解决方案3】:

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

      以下 sn-p 显示了使用新 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);        
      }
      

      【讨论】:

      • 如果你喜欢无限循环,复制粘贴这段代码
      • 为什么这是一个无限循环? S3中不会有无限项吧?
      • 你能看看这个链接并帮助我吗? github.com/kamalababuhanchinal/aws-s3-objects @Igrosales
      【解决方案4】:

      API 版本已更改;所以需要做如下:

                  ListObjectsV2Request request = new ListObjectsV2Request
                  {
                      BucketName = bucketName,
                      MaxKeys = 10
                  };
                  ListObjectsV2Response response;
                  do
                  {
                      response = await client.ListObjectsV2Async(request);
      
                      // Process the response.
                      foreach (S3Object entry in response.S3Objects)
                      {
                          Console.WriteLine("key = {0} size = {1}",
                              entry.Key, entry.Size);
                      }
                      Console.WriteLine("Next Continuation Token: {0}", response.NextContinuationToken);
                      request.ContinuationToken = response.NextContinuationToken;
                  } while (response.IsTruncated);
      

      详情请见https://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingNetSDK.html

      【讨论】:

      • 让你的动作异步。
      【解决方案5】:

      使用分页器,介绍了here。与 do-while 相比,Amazon 推荐这些语法更简洁,并且它们利用了 C# 8 的 IAsyncEnumerable

      IAmazonS3 S3;
      CancellationToken cancellationToken;
      
      var results = new List<S3Object>();
      
      var paginator = S3.Paginators.ListObjectsV2(new ListObjectsV2Request
      {
          BucketName = "my-bucket-name",
          Prefix = "my/prefix",
      });
      await foreach (var response in paginator.Responses.WithCancellation(cancellationToken))
      {
          results.AddRange(response.S3Objects);
      }
      
      return results;
      

      【讨论】:

        猜你喜欢
        • 2015-10-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 2017-12-07
        • 2020-07-07
        • 2011-03-21
        • 2013-08-23
        • 1970-01-01
        相关资源
        最近更新 更多