it-swarm.com.de

Amazon S3-Auflistung "Verzeichnisse"

Ich habe in S3 über die AWS S3 Management Console eine Hierarchie erstellt. Wenn ich den folgenden Code ausführen, um den Bucket aufzulisten:

AmazonS3 s3 = new AmazonS3Client(CRED);
ListObjectsRequest lor = new ListObjectsRequest()
                             .withBucketName("myBucket")
                             .withPrefix("code/");
ObjectListing objectListing = s3.listObjects(lor);
for (S3ObjectSummary summary: objectListing.getObjectSummaries()) {
    System.out.println(summary.getKey());
}

Ich bekomme:

code/ 
code/03000000-0001-0000-0000-000000000000/ 
code/03000000-0001-0000-0000-000000000000/special.js 
code/03000000-0001-0000-0000-000000000000/test.js 
code/03000000-0002-0000-0000-000000000000/ 

Welches ist genau das, was ich erwarten würde. Wenn ich jedoch ein Trennzeichen hinzufüge, so dass ich nur den Inhalt direkt unter "Code /" aufliste, bekomme ich jetzt keine "Unterverzeichnisse" zurück. 

Ändern Sie die Zeile oben (fügen Sie am Ende mit Delimiter () hinzu) in:

ListObjectsRequest lor = new ListObjectsRequest().withBucketName("myBucket")
                                                 .withPrefix("code/")
                                                 .withDelimiter("/");

Und ich bekomme jetzt nur noch:

code/ 

Ich weiß, dass S3 keine "Verzeichnisse" hat, stattdessen getrennte Schlüssel, aber dieses Verhalten scheint seltsam zu sein? Wie würde ich auflisten, was nur unmittelbar unter "Code" steht?

19
Kong

Wenn Sie Schlüssel haben, die keinen Inhalt haben, werden sie von S3 als "gemeinsame Präfixe" betrachtet:

http://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/model/ObjectListing.html#getCommonPrefixes%28%29

öffentliche Liste getCommonPrefixes ()

Ruft die in dieser Objektliste enthaltenen allgemeinen Präfixe ab. Verbreitet Präfixe sind nur vorhanden, wenn in der ursprünglichen .__ ein Trennzeichen angegeben wurde. anfordern.

Jedes gemeinsame Präfix repräsentiert einen Satz von Schlüsseln im S3-Bucket mit wurde verdichtet und aus den Ergebnissen der Objektzusammenfassung weggelassen. Diese Ermöglicht Anwendungen, ihre Schlüssel hierarchisch zu organisieren und zu durchsuchen. Ähnlich wie ein Dateisystem Dateien in Verzeichnissen organisiert.

Angenommen, ein Bucket enthält die folgenden Schlüssel:

"foo/bar/baz"
"foo/bar/bash"
"foo/bar/bang"
"foo/boo" 

Beim Aufruf von listObjects mit dem Präfix = "foo /" und dem Trennzeichen = "/" auf In diesem Bucket enthält das zurückgegebene S3ObjectListing einen Eintrag in die Liste der allgemeinen Präfixe ("foo/bar /") und keiner der Schlüssel, die mit .__ beginnen. mit diesem gemeinsamen Präfix wird in die Objektzusammenfassungsliste aufgenommen.

Rückgabe: Die Liste der allgemeinen Präfixe in dieser Objektliste Dies kann eine leere Liste sein, wenn keine gemeinsamen Präfixe gefunden wurden.

26
Kong

Sie können eine beliebige Verzeichnishierarchie angeben, in der Buckets aufgeführt werden. Wenn prefix auf "" oder "/" gesetzt ist, wird das Verzeichnis der ersten Ebene des Buckets angezeigt. Beim Festlegen eines bestimmten Unterverzeichnisses wird die Liste der Schlüssel des Unterverzeichnisses angezeigt.

Verweis auf Charles Menguys Antwort in "Amazon S3-Liste" Verzeichnisse " , und einige Änderungen hinzugefügt.

  public List<String> listKeysInBucket(String bucketName, String prefix) {
    Boolean isTopLevel = false;
    String delimiter = "/";
    if(prefix == "" || prefix == "/") {
      isTopLevel = true;
    }
    if (!prefix.endsWith(delimiter)) {
      prefix += delimiter;
    }

    ListObjectsRequest listObjectsRequest = null;
    if (isTopLevel) {
      listObjectsRequest =
          new ListObjectsRequest().withBucketName(bucketName).withDelimiter(delimiter);
    } else {
      listObjectsRequest = new ListObjectsRequest().withBucketName(bucketName).withPrefix(prefix)
          .withDelimiter(delimiter);
    }
    ObjectListing objects = s3Client.listObjects(listObjectsRequest);
    return objects.getCommonPrefixes();
  }
0
Elon