web-dev-qa-db-fra.com

Comment répertorier les objets _all_ dans le compartiment Amazon S3?

S3Client.ListObjects ne renvoie que 1000 objets. Comment récupérer la liste de tous les objets existants à l'aide de la bibliothèque Amazon C #?

29
user626528

Comme indiqué précédemment, Amazon S nécessite en effet Liste des clés à l'aide du kit SDK AWS pour .NET :

Comme les compartiments peuvent contenir un nombre pratiquement illimité de clés, les résultats complets d'une requête de liste peuvent être extrêmement volumineux. Pour gérer de grands ensembles de résultats, Amazon S3 utilise la pagination pour les diviser en plusieurs réponses. Chaque réponse de clés de liste renvoie une page contenant jusqu'à 1 000 clés avec un indicateur indiquant si la réponse est tronquée. Vous envoyez une série de demandes de clés de liste jusqu'à ce que vous ayez reçu toutes les clés.

L'indicateur mentionné est la propriété NextMarker de la classe ObjectsResponse - son utilisation est illustrée dans l'exemple complet Liste des clés à l'aide du kit SDK AWS pour .NET , le fragment pertinent étant:

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);
61
Steffen Opel

N'oubliez pas que la réponse ci-dessus n'utilise pas l'API recommandée pour répertorier les objets: http://docs.aws.Amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html

L'extrait suivant montre à quoi il ressemble avec la nouvelle 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);        
}
9
lgrosales

Selon la documentation, le client utilise la pagination dans le cas que vous décrivez. Selon la documentation, vous devez utiliser IsTruncated sur le résultat ... s'il s'agit de true appeler ListObjects à nouveau avec une configuration correcte Marker pour obtenir la page suivante, etc. - arrêtez d'appeler lorsque IsTruncated renvoie false.

0
Yahia