2013-02-01 21 views
7

ho una struttura S3 come segue:Inserzione solo le sotto cartelle in un secchio S3

s3bucketname -> List of first level keys -> List of second level keys -> List of third level keys -> Actual file. 

Che cosa devo fare è che dato il nome del s3bucket e una voce per la prima chiave di livello, io bisogno dei nomi di tutti i tasti di secondo livello che si trovano sotto le chiavi di primo livello. Quindi, in sostanza, se lo consideriamo come una cartella, mi viene dato il nome dello 10 e il nome di una delle sue sottocartelle subfolder1, vorrei elencare tutte le cartelle che si trovano all'interno di subfolder1. Solo i nomi però, non il percorso completo.

Qualcuno può indicare come farlo in java utilizzando java sdk di Amazon?

Grazie

+0

implementato il codice di lavoro da questa discussione qui https://github.com/vinoct6/SimpleAWSClientForS3 – vinoth

risposta

30

ho fatto il seguente codice che sembra funzionare bene, è necessario passare un prefix e assicurarsi che il prefisso termina con /, e anche specificare il delimitatore si desidera ottenere la vostra lista di sub -directories. Il seguente dovrebbe funzionare:

public List<String> listKeysInDirectory(String bucketName, String prefix) { 
    String delimiter = "/"; 
    if (!prefix.endsWith(delimiter)) { 
     prefix += delimiter; 
    } 

    ListObjectsRequest listObjectsRequest = new ListObjectsRequest() 
      .withBucketName(bucketName).withPrefix(prefix) 
      .withDelimiter(delimiter); 
    ObjectListing objects = _client.listObjects(listObjectsRequest); 
    return objects.getCommonPrefixes(); 
} 
+0

Che ha fatto il trucco. Grazie –

+0

ok, sto provando a farlo, ma ho ricevuto un errore di accesso negato. @Charles Menguy hai qualche idea sulla configurazione di accesso S3? – Robert

+0

prefisso -perché è necessario. Voglio ottenere l'elenco di tutti gli elementi nel mio secchio stesso quindi controllerà le sottodirectory. Quindi anche per questo devo aggiungere il prefisso? – beginner

3

La versione di Charles è super concisa! grazie @ charles-menguy

Ho scritto un'estensione per supportare una lista enorme attraverso l'impaginazione.

public List<String> getSubPathsInS3Prefix(String bucketName, String prefix) { 
     if (!prefix.endsWith(FILE_DELIMITER)) { 
      prefix += FILE_DELIMITER; 
     } 
     List<String> paths = new ArrayList<String>(); 
     ListObjectsRequest listObjectsRequest = new ListObjectsRequest() 
       .withBucketName(bucketName).withPrefix(prefix) 
       .withMaxKeys(1000).withDelimiter(FILE_DELIMITER); 
     ObjectListing currentListing = s3Client.listObjects(listObjectsRequest); 
     paths.addAll(currentListing.getCommonPrefixes()); 

     while (currentListing == null || currentListing.isTruncated()) { 
      currentListing = s3Client.listNextBatchOfObjects(currentListing); 
      paths.addAll(currentListing.getCommonPrefixes()); 
     } 
     return paths; 
    } 

http://www.lazywiz.com/uncategorized/s3-missing-api-list-sub-paths-in-the-s3-bucket/

Problemi correlati