web-dev-qa-db-fra.com

Liste Amazon S3 "répertoires"

J'ai créé une hiérarchie dans S3 via AWS S3 Management Console. Si je lance le code suivant pour lister le seau:

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());
}

Je reçois:

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/ 

C'est exactement ce à quoi je m'attendrais. Si j’ajoute un délimiteur, je ne listerai que le contenu directement sous "code /" Je ne récupère plus aucun sous-répertoire ". 

Modifiez la ligne ci-dessus (ajoutez withDelimiter () à la fin) pour:

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

Et je ne reçois maintenant que:

code/ 

Je sais que S3 n'a pas de "répertoires", mais des clés délimitées, mais ce comportement semble étrange? Comment pourrais-je lister ce qui n'est qu'immédiatement sous "code"?

19
Kong

Si vous avez des clés sans contenu, S3 les considère comme des "préfixes communs":

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

liste publique getCommonPrefixes ()

Obtient les préfixes communs inclus dans cette liste d'objets. Commun les préfixes ne sont présents que si un délimiteur a été spécifié dans l'original demande.

Chaque préfixe commun représente un ensemble de clés dans le compartiment S3 qui ont été condensé et omis des résultats du résumé d'objet. Ce permet aux applications d'organiser et de parcourir leurs clés de manière hiérarchique, similaire à la façon dont un système de fichiers organise les fichiers dans des répertoires.

Par exemple, considérons un compartiment contenant les clés suivantes:

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

Si vous appelez listObjects avec le préfixe = "foo /" et le délimiteur = "/" sur Dans ce compartiment, le S3ObjectListing retourné contiendra une entrée dans la liste des préfixes communs ("foo/bar /") et aucune des touches commençant par avec ce préfixe commun sera inclus dans la liste des résumés d'objets.

Retour: La liste des préfixes communs inclus dans cette liste d'objets, ce qui pourrait être une liste vide si aucun préfixe commun n'a été trouvé.

26
Kong

Vous pouvez spécifier n'importe quelle hiérarchie de répertoires répertoriant les compartiments. Lorsque préfixe est défini sur "" ou "/", il indique le répertoire de premier niveau du compartiment. Lors de la configuration d'un sous-répertoire spécifique, la liste des clés du sous-répertoire est affichée.

Référence à la réponse de Charles Menguy dans 'Amazon S3 listant les «répertoires» , et ajout de quelques modifications.

  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