亚马逊S3列出“目录”

我通过AWS S3管理控制台在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/ 

这正是我所期待的。 如果我添加一个分隔符,所以我只在“代码/”下直接列出内容我现在不会得到任何子“目录”。

更改上面的行(在末尾添加withDelimiter()):

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

我现在只得到:

 code/ 

我知道S3没有“目录”,而是分隔键,但这种行为看起来很奇怪? 我如何列出仅在“代码”下方的内容?

如果你有没有内容的密钥S3认为它们是“公共前缀”:

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

public List getCommonPrefixes()

获取此对象列表中包含的公共前缀。 只有在原始请求中指定了分隔符时,才会显示公共前缀。

每个公共前缀表示S3存储桶中的一组键,这些键已从对象汇总结果中压缩并省略。 这允许应用程序按层次组织和浏览其密钥,类似于文件系统将文件组织到目录中的方式。

例如,考虑包含以下键的存储桶:

为 “foo /酒吧/ baz” 的
为 “foo /酒吧/庆典”
为 “foo /酒吧/砰”
“富/ BOO”

如果在此存储桶上调用带有前缀=“foo /”和delimiter =“/”的listObjects,则返回的S3ObjectListing将在公共前缀列表(“foo / bar /”)中包含一个条目,并且没有任何以该条开头的键公共前缀将包含在对象摘要列表中。

返回:此对象列表中包含的公共前缀列表,如果未找到公共前缀,则可能是空列表。