Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Excluding prefix in ObjectListing results Java client for S3

I have a S3 bucket with following hierarchy:

bucketName
    folder1
       file1 

I wanted to get all the files from folder1. I tried to do following:

ObjectListing ol = s3Client.listObjects("bucketName", "folder1"); 
List<S3ObjectSummary> summaries = ol.getObjectSummaries(); 

The problem is that summaries contains folder1/ and folder1/file1. Where as I was hoping to get just folder1/file1.

Looking around at the internet, I also tried following:

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

But this time I got no results back for getObjectSummaries call. When I remove withDelimiter from above I get both folder1\ and folder1\file1 back.

Is there any way to just get folder1\file1 back?

Please let me know. Thanks!

like image 899
test123 Avatar asked Apr 12 '13 22:04

test123


1 Answers

Use withPrefix and withMarker together:

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

This works because first you filter withPrefix and obtain all folder1/* keys, including folder1/, and then with withMarker("folder1/") you specify to get the keys that are lexicographically after "folder1/" as documented in the javadoc:

The list will only include keys that occur lexicographically after the marker.

Furthermore, if folder1 contains other subfolders, you can get the direct children only, using withDelimiter:

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

This works because the delimiter "/" makes all subfolders to be rolled up to "folder1/" but you ignore this result with the marker. The javadoc says for withDelimiter:

Gets the optional delimiter parameter that causes keys that contain the same string between the prefix and the first occurrence of the delimiter to be combined into a single result element (...). The most commonly used delimiter is "/", which simulates a hierarchical organization similar to a file system directory structure.

--

In any case, folder1/ is only listed because you surely created it through the web console. If you don't create folders directly but put objects programmatically, like put folder2/file2 the folder won't be actually created as an independent object and so it cannot be listed.

like image 167
juanmirocks Avatar answered Nov 02 '22 23:11

juanmirocks