排除ObjectListing结果中的前缀Java client for S3

排除ObjectListing结果中的前缀Java client for S3,java,amazon-web-services,amazon-s3,amazon,Java,Amazon Web Services,Amazon S3,Amazon,我有一个具有以下层次结构的S3存储桶: bucketName folder1 file1 我想从folder1获取所有文件。我试图做到以下几点: ObjectListing ol = s3Client.listObjects("bucketName", "folder1"); List<S3ObjectSummary> summaries = ol.getObjectSummaries(); ListObjectsRequest req = new L

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

bucketName
    folder1
       file1 
我想从folder1获取所有文件。我试图做到以下几点:

ObjectListing ol = s3Client.listObjects("bucketName", "folder1"); 
List<S3ObjectSummary> summaries = ol.getObjectSummaries(); 
ListObjectsRequest req = new ListObjectsRequest().withBucketBucketName("bucketName").withPrefix("folder1/").withDelimiter("/"); 
但是这次我没有得到
getObjectSummaries
调用的结果。当我从上面删除带有分隔符的
时,我同时返回
folder1\
folder1\file1

有没有什么方法可以让
folder1\file1
返回


请让我知道。谢谢

将带前缀的
和带标记的
一起使用:

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/");
这是因为首先使用前缀过滤
并获取所有folder1/*键,包括folder1/,然后使用
和标记(“folder1/”)
指定获取按字典顺序排列在“folder1/”之后的键,如中所述:

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

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

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");
这是因为分隔符“/”使所有子文件夹上卷到“folder1/”中,但您可以使用标记忽略此结果。javadoc用分隔符表示for

ListObjectsRequest req = new ListObjectsRequest().withBucketName("bucketName").withPrefix("folder1/").withMarker("folder1/").withDelimiter("/");
获取可选的delimiter参数,该参数使包含前缀和第一次出现的分隔符之间的相同字符串的键组合到单个结果元素(…)中。最常用的分隔符是“/”,它模拟类似于文件系统目录结构的层次结构

--


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

它最终返回所有文件夹及其内容处于同一级别。例如,如果在与
folder1
相同的级别上有
folder2
,那么它也会返回
folder2
。总之,我最终使用,
FileNameUtils.getName()
从结果集中筛选出
folder1
。@test123,这样做您将从s3位置获得所有文件夹。然后你会过滤它。我认为这不是一个可行的解决办法。在我的例子中,我希望获取folder1中的所有文件,但不希望获取folder1/子文件夹1中的所有文件。在获取S3对象时,是否有任何方法可以直接执行此操作