2016-06-27 3 views
11

Мне нужно указать все файлы, содержащиеся в определенной папке, содержащейся в моем ведре S3.Листинг файлов в определенной «папке» ведра AWS S3

структура Папки следующей

/my-bucket/users/<user-id>/contacts/<contact-id> 

У меня есть файлы, связанные с пользователями и файлами, имеющими отношение к контакту какого-либо пользователя. Мне нужно перечислить оба.

Чтобы просмотреть список файлов я использую этот код:

ListObjectsRequest listObjectsRequest = new ListObjectsRequest().withBucketName("my-bucket") 
       .withPrefix("some-prefix").withDelimiter("/"); 
ObjectListing objects = transferManager.getAmazonS3Client().listObjects(listObjectsRequest); 

список файлов определенного пользователя, я буду использовать этот префикс:

users/<user-id>/

и я правильно получать все файлов в каталоге, за исключением contacts, например:

users/<user-id>/file1.txt 
users/<user-id>/file2.txt 
users/<user-id>/file3.txt 

Чтобы просмотреть список файлов определенного пользователя о контакте вместо Я использую этот префикс:

users/<user-id>/contacts/<contact-id>/

, но в этом случае я получаю также сам каталог в качестве возвращаемого объекта:

users/<user-id>/contacts/<contact-id>/file1.txt 
users/<user-id>/contacts/<contact-id>/file2.txt 
users/<user-id>/contacts/<contact-id>/ 

Почему я получаю такое поведение? Чем отличается между двумя запросами на листинг? Мне нужно указать только файлы в каталоге, исключая подкаталоги.

+0

Такое поведение можно было бы ожидать, если вы на самом деле создали «пустую папку» в консоли, потому что действие фактически создает пустой объект с ключом 'путь/к/my/folder/', поэтому консоль имеет местозаполнитель. Вы это делали, проверяя? –

+0

@ Michael-sqlbot Я не создал пустую папку. Infact все файлы загружаются приложением, используя структуру папок, которую я сообщил как префикс для ключа файла. – davioooh

+0

Возможно, вы захотите попробовать «GET» на кажущемся объекте с завершающим косой чертой, потому что, если вы не создали папку, и вы использовали разделитель '/' 'withDelimiter ("/")' при перечислении объектов , это должно означать, что на самом деле у вас есть объект с именем с конечной косой чертой, возможно, из-за ошибки в вашем коде, который был создан таким образом. Такой объект, вероятно, будет невидим в консоли. –

ответ

12

Everthing in S3 - это объект. Для вас это могут быть файлы и папки. Но для S3 они просто объекты.

Объекты, которые заканчиваются разделителем (/ в большинстве случаев), обычно воспринимаются как папка, но это не всегда так. Это зависит от приложения. Опять же, в вашем случае вы интерпретируете его как папку. S3 - нет. Это просто еще один объект.

В вашем случае выше объект users/<user-id>/contacts/<contact-id>/ существует в S3 как отдельный объект, но объект users/<user-id>/ нет. В этом разница в ваших ответах. Почему они такие, мы не можем вам сказать, но кто-то сделал объект в одном случае, а другой не был. Вы не видите его в консоли управления AWS, потому что консоль интерпретирует его как папку и скрывает его от вас.

Поскольку S3 просто видит эти вещи как объекты, он не «исключает» определенные вещи для вас. Клиент должен иметь дело с объектами, так как с ними следует обращаться.

Ваше решение

Поскольку вы тот, который не хочет, чтобы объекты папки, вы можете исключить его самостоятельно, проверив последний символ для /. Если это так, то игнорируйте объект из ответа.

0

У S3 нет каталогов, в то время как вы можете перечислить файлы в псевдо-каталоге, как вы продемонстрировали, нет каталога «файл» per se.
Возможно, вы случайно создали файл данных с именем users/<user-id>/contacts/<contact-id>/.

+0

Я не вижу никаких файлов 'users//contacts/ /' в моей консоли управления , но, если он существует, как я могу исключить это? – davioooh

8

Хотя все говорят, что в s3 нет каталогов и файлов, но только объекты (и ведра), что абсолютно верно, я бы предложил использовать CommonPrefixes, описанные в this. Таким образом, вы можете сделать следующее, чтобы получить список «папки» (commonPrefixes) и «файлы» (objectSummaries):

ListObjectsV2Request req = new ListObjectsV2Request().withBucketName(bucket.getName()).withPrefix(prefix).withDelimiter(DELIMITER); 
ListObjectsV2Result listing = s3Client.listObjectsV2(req); 
for (String commonPrefix : listing.getCommonPrefixes()) { 
     System.out.println(commonPrefix); 
} 
for (S3ObjectSummary summary: listing.getObjectSummaries()) { 
    System.out.println(summary.getKey()); 
} 

В вашем случае, для objectSummaries (файлов) он должен вернуться (в случае правильного префикса):
пользователей/ID пользователя/контакты/контакт-ID/file1.txt
пользователей/ID пользователя/контакты/контакт-ID/file2.txt

для commonPrefixes:
пользователей/user-id/contacts/contact-id/

+0

ListObjectsV2 по-прежнему не используется заметно. .getCommonPrefixes() - это действительно путь сюда. – Omkar

+0

Проверьте эту статью здесь, похоже, что это именно то, что вы ищете: http://codeflex.co/get-list-of-objects-from-s3-directory/ – user5495300

Смежные вопросы