我有一个具有以下层次结构的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找回来吗?

请告诉我。谢谢!

最佳答案

一起使用withPrefixwithMarker:

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一样,该文件夹实际上不会创建为独立对象,因此无法列出。

10-08 03:08