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
回来吗?
请告诉我。谢谢!
使用withPrefix
和withMarker
在一起:
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
该文件夹实际上不会创建为独立对象,因此无法列出。
归档时间: |
|
查看次数: |
2037 次 |
最近记录: |