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

时间:2013-04-12 22:09:58

标签: java amazon-web-services amazon-s3 amazon

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

请告诉我。谢谢!

1 个答案:

答案 0 :(得分:4)

同时使用withPrefixwithMarker

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/");

这是有效的,因为首先过滤withPrefix并获取所有folder1 / *键,包括folder1 /,然后使用withMarker("folder1/")指定在“folder1 /”之后按字典顺序获取键在javadoc

  

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

此外,如果folder1包含其他子文件夹,则只能使用withDelimiter获取直接子项:

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");

这是有效的,因为分隔符“/”使所有子文件夹都卷起到“folder1 /”,但是你用标记忽略了这个结果。 javadoc对withDelimiter说:

  

获取可选的delimiter参数,该参数使得在前缀和分隔符的第一个匹配项之间包含相同字符串的键组合成单个结果元素(...)。最常用的分隔符是“/”,它模拟类似于文件系统目录结构的分层组织。

-

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