13

I'm using AWS IOS SDK and trying to list all the files in a FOLDER.

This code works to list all files etc in a BUCKET:

-(void) s3DirectoryListing: (NSString *) bucketName {

    s3Client = [[AmazonS3Client alloc] initWithAccessKey:ACCESS_KEY withSecretKey:SECRET_KEY];

    @try {

        S3ListObjectsRequest *req = [[S3ListObjectsRequest alloc] initWithName:bucketName];

        S3ListObjectsResponse *resp = [s3Client listObjects:req];

        NSMutableArray* objectSummaries = resp.listObjectsResult.objectSummaries;  

        for (int x = 0; x < [objectSummaries count]; x++) {
            NSLog(@"objectSummaries: %@",[objectSummaries objectAtIndex:x]);
        }
    }
    @catch (NSException *exception) {
    NSLog(@"Cannot list S3 %@",exception);
}

}

So if I pass a bucketName name, this works. However if I try and pass bucketName/folderName" I get an error message. This code doesn't seem to like the combination of bucket and folder path combinations.

Any ideas appreciated.

Jeremy
  • 883
  • 1
  • 20
  • 41

1 Answers1

22

Amazon S3 is a "flat" file system, meaning it does not have physical folders. "Folders" as you know are simply prefixes added to file names.

You need to set the prefix property to your request (see the documentation)

For example, given the following set of files:

folderName1/fileNameA.txt
folderName1/fileNameB.txt
folderName2/folderName3/fileNameC.txt

If you set prefix with folderName1, and your delimiter with /, you should get only the first two entries.

Last, but not least, leave your bucketName only with the bucket name :)

More info at the S3 Developer Guide.

Viccari
  • 9,029
  • 4
  • 43
  • 77
  • 6
    Actually for this to work you have to set the prefix to "folderName1/". It wasn't so obvious to me before reading the doc that the prefix must include the delimiter in order to work... – vdaubry Jun 10 '12 at 07:40
  • 1
    Another thing to watch out for: The result set is truncated at 1000. Check the isTruncated flag and run consecutive requests with a marker for stating the last object obtained. – Stavash Apr 16 '14 at 10:56