Как перечислить _все_ объекты в корзине Amazon S3? - PullRequest
27 голосов
/ 29 марта 2012

S3Client.ListObjects возвращает только 1000 объектов. Как получить список всех существующих объектов с помощью библиотеки Amazon C #?

Ответы [ 3 ]

58 голосов
/ 29 марта 2012

Как уже говорилось, Amazon S3 действительно требует перечисления ключей с использованием AWS SDK для .NET :

Поскольку корзины могут содержать практически неограниченное количество ключей, Полные результаты запроса списка могут быть очень большими. Управлять Большие наборы результатов, Amazon S3 использует разбиение на страницы, чтобы разделить их на несколько ответов. Каждый ответ списка ключей возвращает страницу до 1000 клавиш с индикатором, показывающим, урезан ли ответ. Вы отправляете серию запросов списка ключей, пока не получите все ключи.

Упомянутый индикатор является свойством NextMarker из класса ObjectsResponse - его использование иллюстрируется в полном примере Вывод списка ключей с использованием AWS SDK для .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);
8 голосов
/ 18 мая 2017

Учтите, что в приведенном выше ответе не используется рекомендуемый 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);        
}
0 голосов
/ 29 марта 2012

Согласно документации, клиент использует нумерацию страниц в описываемом вами случае. Согласно документации, вы должны использовать IsTruncated для результата ... если это true, снова вызвать ListObjects с правильной настройкой Marker для перехода на следующую страницу и т. Д. - прекратить звонить, когда IsTruncated возвращает false.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...