Amazon Web Services (AWS) S3 Java create a sub directory (object)

There are no "sub-directories" in S3. There are buckets and there are keys within buckets.

You can emulate traditional directories by using prefix searches. For example, you can store the following keys in a bucket:

foo/bar1
foo/bar2
foo/bar3
blah/baz1
blah/baz2

and then do a prefix search for foo/ and you will get back:

foo/bar1
foo/bar2
foo/bar3

See AmazonS3.listObjects for more details.


Update: Assuming you already have an existing bucket, the key under that bucket would contain the /:

s3.putObject("someBucket", "foo/bar1", file1);
s3.putObject("someBucket", "foo/bar2", file2);
...

Then you can list all keys starting with foo/:

ObjectListing listing = s3.listObjects("someBucket", "foo/");

S3 doesn't see directories in the traditional way we do this on our operating systems. Here is how you can create a directory:

public static void createFolder(String bucketName, String folderName, AmazonS3 client) {
    // create meta-data for your folder and set content-length to 0
    ObjectMetadata metadata = new ObjectMetadata();
    metadata.setContentLength(0);

    // create empty content
    InputStream emptyContent = new ByteArrayInputStream(new byte[0]);

    // create a PutObjectRequest passing the folder name suffixed by /
    PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
                folderName + SUFFIX, emptyContent, metadata);

    // send request to S3 to create folder
    client.putObject(putObjectRequest);
}

As casablanca already said you can upload files to directories like this:

s3.putObject("someBucket", "foo/bar1", file1);

Read the whole tutorial here for details, and the most important thing is you will find info how to delete the directories.


In newer versions of the SDK, you can do something like this (no need to create empty InputStream) to create an empty folder:

String key = parentKey + newFolderName;
if (!StringUtils.endsWith(key, "/")) {
    key += "/";
}

PutObjectRequest putRequest = PutObjectRequest.builder()
        .bucket(parent.getBucket())
        .key(key)
        .acl("public-read")
        .build();
s3Client.putObject(putRequest, RequestBody.empty());