S3Client.ListObjects gibt nur 1000 Objekte zurück. Wie kann ich eine Liste aller vorhandenen Objekte mit der Amazon C# -Bibliothek abrufen?Wie listet _all_ Objekte in Amazon S3-Bucket auf?
Antwort
Wie bereits erwähnt, Amazon S3 tatsächlich Listing Keys Using the AWS SDK for .NET erfordert:
Als Eimer eine nahezu unbegrenzte Anzahl von Tasten enthalten, die vollständigen Ergebnisse einer Listenabfrage können sehr groß sein. Zur Verwaltung der großen Ergebnismengen verwendet Amazon S3 die Seitennummerierung, um sie in mehrere Antworten zu unterteilen: . Jede Listenschlüsselantwort gibt eine Seite mit bis zu 1.000 Schlüsseln mit einem Indikator zurück, der angibt, ob die Antwort abgeschnitten ist. Sie senden eine Reihe von Listenschlüsselanfragen, bis Sie alle die Schlüssel erhalten haben.
Der erwähnte Indikator ist die NextMarker Eigenschaft aus den ObjectsResponse Class - seine Nutzung ist im gesamten dargestellten Beispiel Listing Keys Using the AWS SDK for .NET, mit den entsprechenden Fragmente Wesen:
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);
Nach der Dokumentation der Client Paginierung in dem uses Fall, den du beschreibst. Laut Dokumentation sollten Sie IsTruncated auf das Ergebnis verwenden ... wenn es true
ist, rufen Sie erneut ListObjects
mit der richtigen Einrichtung Marker
, um die nächste Seite usw. zu erhalten - hören Sie auf, wenn IsTruncated
false
zurückgibt.
Beachten Sie, dass die Antwort über die empfohlene API verwendet Objekte zur Liste: http://docs.aws.amazon.com/AmazonS3/latest/API/v2-RESTBucketGET.html
Der folgende Ausschnitt zeigt, wie es mit der neuen API aussieht:
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 == true);
}
über 2 Jahre später und nach wie vor die perfekte Lösung für mich! Danke :) – hardba11
Perfekte Antwort ... –
Ihr zweiter Link ist jetzt gebrochen (Iterating durch Multi-Page Ergebnisse), und kann stattdessen hier gefunden werden: http://docs.aws.amazon.com/AmazonS3/latest/dev/ ListingObjectKeysUsingNetSDK.html – adamdport