Amazon S3 перечисляет "каталоги"

Я создал иерархию в S3 через консоль управления AWS S3. Если я запустил следующий код, чтобы перечислить ведро:

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

Я получаю:

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/ 

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

Измените строку выше (добавьте с конца в конец) в:

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

И теперь я получаю только:

code/ 

Я знаю, что у S3 нет "каталогов", вместо этого ограничены ключи, но это поведение кажется странным? Как бы я перечислил, что находится только под "кодом"?

Ответы

Ответ 1

Если у вас есть ключи, у которых нет контента, S3 считает их "Обычными префиксами":

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

public Список getCommonPrefixes()

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

Каждый общий префикс представляет собой набор ключей в ведро S3, которые имеют были сжаты и опущены из итоговых результатов объекта. Эта позволяет приложениям организовывать и просматривать их ключи иерархически, подобно тому, как файловая система организует файлы в каталогах.

Например, рассмотрите ведро, содержащее следующие ключи:

"Foo/бар/Baz"
"Foo/бар/ bash"
"Foo/бар/бах"
"foo/boo"

При вызове listObjects с префиксом = "foo/" и разделителем = "/" на этот ведро, возвращаемый S3ObjectListing будет содержать одну запись в общий список префиксов ( "foo/bar/" ), и ни один из ключей не начинается с тем, что общий префикс будет включен в список резюме объектов.

Возвраты: список общих префиксов, включенных в этот список объектов, который может быть пустым списком, если не было найдено общих префиксов.