我有一个具有以下层次结构的S3存储桶:
bucketName
folder1
file1
我想从folder1中获取所有文件。我尝试执行以下操作:
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
找回来吗?请告诉我。谢谢!
最佳答案
一起使用withPrefix
和withMarker
:
ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/");
之所以有效,是因为首先过滤
withPrefix
并获取所有folder1/*键,包括folder1/,然后使用withMarker("folder1/")
指定获取按字典顺序在javadoc中记录的“folder1/”之后的键:此外,如果folder1包含其他子文件夹,则可以使用
withDelimiter
仅获取直接子级:ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");
之所以有效,是因为定界符“/”使所有子文件夹都汇总为“folder1/”,但是您可以用标记忽略此结果。 Javadoc表示
withDelimiter
:--
无论如何,仅列出
folder1/
是因为您肯定是通过Web控制台创建的。如果您不是直接创建文件夹而是通过编程方式放置对象,则像put folder2/file2
一样,该文件夹实际上不会创建为独立对象,因此无法列出。