在ObjectListing结果中排除前缀S3的Java客户端

tes*_*123 5 java amazon amazon-s3 amazon-web-services

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

bucketName
    folder1
       file1 
Run Code Online (Sandbox Code Playgroud)

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

ObjectListing ol = s3Client.listObjects("bucketName", "folder1"); 
List<S3ObjectSummary> summaries = ol.getObjectSummaries(); 
Run Code Online (Sandbox Code Playgroud)

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

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

ListObjectsRequest req = new ListObjectsRequest().withBucketBucketName("bucketName").withPrefix("folder1/").withDelimiter("/"); 
Run Code Online (Sandbox Code Playgroud)

但是这次我没有回getObjectSummaries电话的结果。当我删除withDelimiter从上面我同时获得folder1\folder1\file1背部。

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

请告诉我。谢谢!

jua*_*cks 6

使用withPrefixwithMarker在一起:

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/");
Run Code Online (Sandbox Code Playgroud)

之所以有效,是因为首先过滤withPrefix并获取所有folder1 / *键,包括folder1 /,然后withMarker("folder1/")指定获取按字典顺序在字典首尾的键,如javadoc中所述:

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

此外,如果folder1包含其他子文件夹,则可以使用withDelimiter以下方式仅获取直接子级:

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");
Run Code Online (Sandbox Code Playgroud)

之所以有效,是因为定界符“ /”使所有子文件夹都汇总为“ folder1 /”,但是您可以用标记忽略此结果。javadoc说withDelimiter

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

-

无论如何,folder1/仅列出它是因为您肯定是通过Web控制台创建的。如果您不是直接创建文件夹而是通过编程方式放置对象,则put folder2/file2该文件夹实际上不会创建为独立对象,因此无法列出。