我有一个具有以下层次结构的 S3 存储桶:
bucketName
folder1
file1
我想获取folder1 中的所有文件。我尝试执行以下操作:
ObjectListing ol = s3Client.listObjects("bucketName", "folder1");
List<S3ObjectSummary> summaries = ol.getObjectSummaries();
问题是摘要包含folder1/
and folder1/file1
。我希望得到的只是folder1/file1
.
在网上查了一下,我也尝试过以下方法:
ListObjectsRequest req = new ListObjectsRequest().withBucketBucketName("bucketName").withPrefix("folder1/").withDelimiter("/");
但这次我没有得到任何结果getObjectSummaries
称呼。当我删除时withDelimiter
从上面我得到了两个folder1\
and folder1\file1
back.
有什么办法可以得到folder1\file1
back?
Use withPrefix
and withMarker
一起:
ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/");
这是有效的,因为首先你过滤withPrefix
并获取所有folder1/*键,包括folder1/,然后使用withMarker("folder1/")
您指定获取按字典顺序排列在“folder1/”之后的键,如javadoc http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/index.html:
该列表将仅包含按字典顺序出现在标记之后的键。
此外,如果folder1包含其他子文件夹,您只能获取直接子文件夹,使用withDelimiter
:
ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");
这是有效的,因为分隔符“/”使所有子文件夹都汇总到“folder1/”,但您可以使用标记忽略此结果。 javadoc说的是withDelimiter
:
获取可选的分隔符参数,该参数导致在前缀和分隔符第一次出现之间包含相同字符串的键组合成单个结果元素 (...)。最常用的分隔符是“/”,它模拟类似于文件系统目录结构的分层组织。
--
任何状况之下,folder1/
之所以列出,只是因为您肯定是通过 Web 控制台创建的。如果您不直接创建文件夹而是以编程方式放置对象,例如put folder2/file2
该文件夹实际上不会创建为独立对象,因此无法列出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)