Bharat Mhatre
Bharat Mhatre

Reputation: 437

Add folder in Amazon s3 bucket

I want to add Folder in my amazon s3 bucket using coding. Can you please suggest me how to achieve this?

Upvotes: 38

Views: 105620

Answers (17)

Rphl dmczk
Rphl dmczk

Reputation: 1

This worked for me:

To transfer all the files in a folder from an instance to a S3 bucket:

  • go to the folder where the files are located
  • type:
~ for i in *; do    aws s3api put-object --bucket [bucket_name] --key [folder]/${i%/} --body ${i%/}; done

OR

~ for i in *; do    aws s3 cp s3://[bucket_name]/[folder]/${i%/} /[folder]/${i%/} ; done

Upvotes: 0

BigData-Guru
BigData-Guru

Reputation: 1261

You can use copy command to create a folder while copy a file.

aws s3 cp test.xml s3://mybucket/myfolder/test.xml

Upvotes: 0

Mudit Nagpal
Mudit Nagpal

Reputation: 9

I guess your query is just simply creating a folder inside folder(subfolder). so while coping any directory data inside a bucket sub folder use command like this.

aws s3 cp mudit s3://mudit-bucket/Projects-folder/mudit-subfolder --recursive

It will create a subfolder and put ur directory contents in it. Also once your subfolder data gets empty. Your Subfolder will automatically gets deleted.

Upvotes: 0

Drakes
Drakes

Reputation: 23660

This is a divisive topic, so here is a screenshot in 2019 of the AWS S3 console for adding folders and the note:

When you create a folder, S3 console creates an object with the above name appended by suffix "/" and that object is displayed as a folder in the S3 console.

Then 'using coding' you can simply adjust the object name by prepending a valid folder name string and a forward slash.

Adding folders to S3

Upvotes: 3

Yusuf Hassan
Yusuf Hassan

Reputation: 2013

Here's how you can achieve what you're looking for (from code/cli):

--create/select the file (locally) which you want to move to the folder:

~/Desktop> touch file_to_move

--move the file to s3 folder by executing:

~/Desktop> aws s3 cp file_to_move s3://<path_to_your_bucket>/<new_folder_name>/

A new folder will be created on your s3 bucket and you'll now be able to execute cp, mv, rm ... statements i.e. manage the folder as usual.

If this new file created above is not required, simply delete it. You now have an s3 bucket created.

Upvotes: 1

mkrana
mkrana

Reputation: 430

in-order to create a directory inside s3 bucket and copy contents inside that is pretty simple.

S3 command can be used: aws s3 cp abc/def.txt s3://mybucket/abc/

Note: / is must that makes the directory, otherwise it will become a file in s3.

Upvotes: 0

tehemperorer
tehemperorer

Reputation: 259

Java with AWS SDK:

  1. There are no folders in s3, only key/value pairs. The key can contain slashes (/) and that will make it appear as a folder in management console, but programmatically it's not a folder it is a String value.

  2. If you are trying to structure your s3 bucket, then your naming conventions (the keys you give your files) can simply follow normal directory patterns, i.e. folder/subfolder/file.txt.

    When searching (depending on language you are using), you can search via prefix with a delimiter. In Java, it would be a listObjects(String storageBucket, String prefix, String delimiter) method call.

    The storageBucket is the name of your bucket, the prefix is the key you want to search, and the delimiter is used to filter your search based off the prefix.

Upvotes: 18

Yogesh Dalavi
Yogesh Dalavi

Reputation: 73

In iOS (Objective-C), I did following way

You can add below code to create a folder inside amazon s3 bucket programmatically. This is working code snippet. Any suggestion Welcome.

-(void)createFolder{
    AWSS3PutObjectRequest *awsS3PutObjectRequest = [AWSS3PutObjectRequest new];
    awsS3PutObjectRequest.key = [NSString stringWithFormat:@"%@/", @"FolderName"];
    awsS3PutObjectRequest.bucket = @"Bucket_Name";
    AWSS3 *awsS3 = [AWSS3 defaultS3];
    [awsS3 putObject:awsS3PutObjectRequest completionHandler:^(AWSS3PutObjectOutput * _Nullable response, NSError * _Nullable error) {
        if (error) {
            NSLog(@"error Creating folder");
        }else{
            NSLog(@"Folder Creating Sucessful");
        }
    }];
}

Upvotes: 1

Manohar Reddy Poreddy
Manohar Reddy Poreddy

Reputation: 27395

Below creates a empty directory called "mydir1".

Below is nodejs code, it should be similar for other languages.

The trick is to have slash (/) at the end of the name of object, as in "mydir1/", otherwise a file with name "mydir1" will be created.

let AWS = require('aws-sdk');
AWS.config.loadFromPath(__dirname + '\\my-aws-config.json');
let s3 = new AWS.S3();

var params = {
    Bucket: "mybucket1",
    Key: "mydir1/",
    ServerSideEncryption: "AES256" };

s3.putObject(params, function (err, data) {
    if (err) {
        console.log(err, err.stack); // an error occurred
        return;
    } else {
        console.log(data);           // successful response
        return;
        /*
         data = {
         ETag: "\"6805f2cfc46c0f04559748bb039d69ae\"",
         ServerSideEncryption: "AES256",
         VersionId: "Ri.vC6qVlA4dEnjgRV4ZHsHoFIjqEMNt"
         }
         */
    } });

Source: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#putObject-property

Upvotes: 0

coolharsh55
coolharsh55

Reputation: 1199

With aws cli, it is possible to copy an entire folder to a bucket.

aws s3 cp /path/to/folder s3://bucket/path/to/folder --recursive

There is also the option to sync a folder using aws s3 sync

Upvotes: 3

Mohsin Qureshi
Mohsin Qureshi

Reputation: 1213

In swift 2.2 you can create folder using

func createFolderWith(Name: String!) {
    let folderRequest: AWSS3PutObjectRequest = AWSS3PutObjectRequest()
    folderRequest.key = Name + "/"
    folderRequest.bucket = "Your Bucket Name"
    AWSS3.defaultS3().putObject(folderRequest).continueWithBlock({ (task) -> AnyObject? in
        if task.error != nil {
            assertionFailure("* * * error: \(task.error?.localizedDescription)")
        } else {
            print("created \(Name) folder")
        }
        return nil
    })
}

Upvotes: 0

Dan Leonard
Dan Leonard

Reputation: 3395

For Swift I created a method where you pass in a String for the folder name.

Swift 3:

import AWSS3

func createFolderWith(Name: String!) {
    let folderRequest: AWSS3PutObjectRequest = AWSS3PutObjectRequest()
    folderRequest.key = Name + "/"
    folderRequest.bucket = bucket
    AWSS3.default().putObject(folderRequest).continue({ (task) -> Any? in
        if task.error != nil {
            assertionFailure("* * * error: \(task.error?.localizedDescription)")
        } else {
            print("created \(Name) folder")
        }
        return nil
    })
}

Then just call

 createFolderWith(Name:"newFolder")

Upvotes: 2

koolhead17
koolhead17

Reputation: 1964

You can select language of your choice from available AWS SDK

Alternatively you can try minio client libraries available in Python, Go, .Net, Java, Javascript for your application development environment, it has example directory with all basic operations listed.

Disclaimer: I work for Minio

Upvotes: 0

Jravict
Jravict

Reputation: 313

As everyone has told you, in AWS S3 there aren't any "folders", you're thinking of them incorrectly. AWS S3 has "objects", these objects can look like folders but they aren't really folders in the fullest sense of the word. If you look for creating folders on the Amazon AWS S3 you won't find a lot of good results.

There is a way to create "folders" in the sense that you can create a simulated folder structure on the S3, but again, wrap your head around the fact that you are creating objects in S3, not folders. Going along with that, you will need the command "put-object" to create this simulated folder structure. Now, in order to use this command, you need the AWS CLI tools installed, go here AWS CLI Installation for instructions to get them installed.

The command is this:

aws s3api put-object --bucket your-bucket-name --key path/to/file/yourfile.txt --body yourfile.txt

Now, the fun part about this command is, you do not need to have all of the "folders" (objects) created before you run this command. What this means is you can have a "folder" (object) to contain things, but then you can use this command to create the simulated folder structure within that "folder" (object) as I discussed earlier. For example, I have a "folder" (object) named "importer" within my S3 bucket, lets say I want to insert sample.txt within a "folder" (object) structure of the year, month, and then a sample "folder" (object) within all of that.

If I only have the "importer" object within my bucket, I do not need to go in beforehand to create the year, month, and sample objects ("folders") before running this command. I can run this command like so:

aws s3api put-object --bucket my-bucket-here --key importer/2016/01/sample/sample.txt --body sample.txt

The put-object command will then go in and create the path that I have specified in the --key flag. Here's a bit of a jewel: even if you don't have a file to upload to the S3, you can still create objects ("folders") within the S3 bucket, for example, I created a shell script to "create folders" within the bucket, by leaving off the --body flag, and not specifying a file name, and leaving a slash at the end of the path provided in the --key flag, the system creates the desired simulated folder structure within the S3 bucket without inserting a file in the process.

Hopefully this helps you understand the system a little better.

Note: once you have a "folder" structure created, you can use the S3's "sync" command to syncronize the descendant "folder" with a folder on your local machine, or even with another S3 bucket.

Upvotes: 28

elranu
elranu

Reputation: 2312

With AWS SDK .Net works perfectly, just add "/" at the end of the name folder:

var folderKey =  folderName + "/"; //end the folder name with "/"
AmazonS3 client = Amazon.AWSClientFactory.CreateAmazonS3Client(AWSAccessKey, AWSSecretKey);
var request = new PutObjectRequest();
request.WithBucketName(AWSBucket);
request.WithKey(folderKey);
request.WithContentBody(string.Empty);
S3Response response = client.PutObject(request);

Then refresh your AWS console, and you will see the folder

Upvotes: 7

samvermette
samvermette

Reputation: 40437

The AWS:S3 rails gem does this by itself:

AWS::S3::S3Object.store("teaser/images/troll.png", file, AWS_BUCKET)

Will automatically create the teaser and images "folders" if they don't already exist.

Upvotes: 10

cloudberryman
cloudberryman

Reputation: 4698

There are no folders in Amazon S3. It just that most of the S3 browser tools available show part of the key name separated by slash as a folder.

If you really need that you can create an empty object with the slash at the end. e.g. "folder/" It will looks like a folder if you open it with a GUI tool and AWS Console.

Upvotes: 48

Related Questions