5

我有一个具有以下层次结构的 S3 存储桶:

bucketName
    folder1
       file1 

我想从文件夹 1 中获取所有文件。我尝试执行以下操作:

ObjectListing ol = s3Client.listObjects("bucketName", "folder1"); 
List<S3ObjectSummary> summaries = ol.getObjectSummaries(); 

问题是摘要包含folder1/folder1/file1。正如我希望得到的那样folder1/file1

环顾互联网,我还尝试了以下操作:

ListObjectsRequest req = new ListObjectsRequest().withBucketBucketName("bucketName").withPrefix("folder1/").withDelimiter("/"); 

但这一次我没有回getObjectSummaries电话的结果。当我withDelimiter从上面移除时,我得到了两者folder1\folder1\file1返回。

有什么办法可以直接folder1\file1回来吗?

请告诉我。谢谢!

4

1 回答 1

7

withPrefixwithMarker一起使用:

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/");

这是有效的,因为首先您过滤withPrefix并获取所有文件夹 1/* 键,包括文件夹 1/,然后withMarker("folder1/")指定获取按字典顺序排列在“文件夹 1/”之后的键,如javadoc中所述:

该列表将仅包括按字典顺序出现在标记之后的键。

此外,如果 folder1 包含其他子文件夹,则只能使用以下方法获取直接子文件夹withDelimiter

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");

这是有效的,因为定界符“/”使所有子文件夹都被汇总到“folder1/”,但是你用标记忽略了这个结果。javadoc 说withDelimiter

获取可选的分隔符参数,该参数导致在前缀和分隔符的第一次出现之间包含相同字符串的键组合成单个结果元素 (...)。最常用的分隔符是“/”,它模拟类似于文件系统目录结构的分层组织。

--

在任何情况下,folder1/仅列出,因为您确实通过 Web 控制台创建了它。如果您不直接创建文件夹而是以编程方式放置对象,例如put folder2/file2文件夹实际上不会被创建为独立对象,因此无法列出。

于 2013-04-13T15:08:00.510 回答