Amazon Web Services (AWS) S3 Java create a sub dir

2020-05-18 11:01发布

I am familiar with AWS Java SDK, I also tried to browse the corresponding Javadoc, but I could not realize how do I create a sub directory, i.e., a directory object within a bucket, and how do I upload files to it.

Assume bucketName and dirName correspond to already existing bucket (with public permission) and a new (object) directory which needs to be created within the bucket (i.e. bucketName/dirName/)

I have tried the following:

AmazonS3Client s3 = new AmazonS3Client(
    new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY));
s3.createBucket(bucketName + "/" + dirName); //throws exception

which throws an exception on the second line.

A short snippet which creates a sub-directory and uploads files to it will be deeply appreciated.

4条回答
Viruses.
2楼-- · 2020-05-18 11:41

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.

查看更多
Animai°情兽
3楼-- · 2020-05-18 11:50

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());
查看更多
啃猪蹄的小仙女
4楼-- · 2020-05-18 11:53

if You want to create folder then you need to use put command using following keys to create folder1 in:

in root of bucket -> folder1/folder1_$folder$

in path folder2/folder3/ -> folder2/folder3/folder1/folder1_$folder$

It is always all_previous_folders/folderName/folderName_$folder$

查看更多
狗以群分
5楼-- · 2020-05-18 11:56

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/");
查看更多
登录 后发表回答