2013-02-01 10 views
7

Mam strukturę s3 następująco:Spis tylko sub foldery w wiaderku s3

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

Co muszę zrobić, jest to, że dana nazwa s3bucket i wpis na klucz pierwszego stopnia, I potrzebują nazw wszystkich kluczy drugiego poziomu, które znajdują się pod kluczami pierwszego poziomu. Zasadniczo, jeśli spojrzymy na to jak na folder, otrzymam nazwę root folder, która jest s3bucketname i nazwą jednego z jego podfolderów subfolder1, chciałbym wymienić wszystkie foldery, które znajdują się w subfolder1. Tylko nazwy, ale nie pełna ścieżka.

Czy ktoś może wskazać, jak to zrobić w Javie przy użyciu java sdk amazon?

Dzięki

+0

Wprowadzone kod działa z tego wątku tutaj https://github.com/vinoct6/SimpleAWSClientForS3 – vinoth

Odpowiedz

30

zrobiłem następujący kod, który wydaje się działać prawidłowo, trzeba zdać prefix i upewnij się, że przedrostek kończy /, a także określić separator, który chcesz otrzymać listę sub -directories. Powinno działać:

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

To załatwiło sprawę. Dzięki –

+0

ok, próbuję to zrobić, ale mam błąd odmowy dostępu. @Charles Menguy czy masz jakieś pojęcie o konfiguracji dostępu S3? – Robert

+0

prefiks - dlaczego jest to wymagane. Chcę uzyskać listę wszystkich elementów w moim wiadrze, a następnie sprawdzę podkatalogi. Więc do tego też muszę dodać prefiks? – beginner

3

Wersja Charles jest super zwięzła! dzięki @ charles-menguy

Napisałem rozszerzenie obsługujące ogromną listę poprzez stronicowanie.

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/

Powiązane problemy