Подтвердить что ты не робот

Как перечислить объекты _all_ в ведро Amazon S3?

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

4b9b3361

Ответ 1

Как уже говорилось, 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);

Ответ 2

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

Ответ 3

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