在Amazon s3存储桶中添加文件夹

Add folder in Amazon s3 bucket

我想使用编码将文件夹添加到我的Amazon s3存储桶中。
您能建议我如何实现吗?


Amazon S3中没有文件夹。只是大多数可用的S3浏览器工具都显示了一部分的键名,并用斜杠分隔为文件夹。

如果确实需要,可以在结尾处创建一个空对象。例如如果您使用GUI工具和AWS Console打开它,它将看起来像一个文件夹。


带有AWS开发工具包的Java:

  • s3中没有文件夹,只有键/值对。该键可以包含斜杠(/),这将使其在管理控制台中显示为文件夹,但是以编程方式,它不是文件夹,而是String值。

  • 如果您尝试构建s3存储桶,则命名约定(提供文件的键)可以简单地遵循常规目录模式,即folder/subfolder/file.txt

    搜索时(取决于您使用的语言),您可以通过带定界符的前缀进行搜索。在Java中,这将是listObjects(String storageBucket, String prefix, String delimiter)方法调用。

    storageBucket是存储桶的名称,prefix是要搜索的键,delimiter用于根据prefix过滤搜索。


  • 正如每个人都告诉您的那样,在AWS S3中没有任何"文件夹",您在错误地考虑它们。 AWS S3具有"对象",这些对象看起来可能像文件夹,但从词义上来说,它们并不是真正的文件夹。如果您要在Amazon AWS S3上创建文件夹,则不会发现很多好的结果。

    在可以在S3上创建模拟的文件夹结构的意义上,有一种创建"文件夹"的方法,但是同样,请注意在S3中创建对象而不是文件夹的事实。随之,您将需要命令" put-object"来创建此模拟文件夹结构。现在,为了使用此命令,您需要安装AWS CLI工具,请转到此处AWS CLI安装以获取安装它们的说明。

    命令是这样的:

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

    现在,关于此命令的有趣部分是,您无需在运行此命令之前创建所有"文件夹"(对象)。这意味着您可以有一个"文件夹"(对象)来容纳东西,但是您可以使用此命令在该"文件夹"(对象)中创建模拟的文件夹结构,如我之前所讨论的。例如,我在S3存储桶中有一个名为" importer"的"文件夹"(对象),可以说我想在年,月的"文件夹"(对象)结构中插入sample.txt,然后在"文件夹"(对象)。

    如果我的存储桶中只有" importer"对象,则在运行此命令之前,无需事先进入即可创建年,月和示例对象("文件夹")。我可以这样运行此命令:

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

    然后,put-object命令将进入并创建我在--key标志中指定的路径。这有点像珠宝:即使您没有要上传到S3的文件,您仍然可以在S3存储桶中创建对象("文件夹"),例如,我创建了一个Shell脚本来"创建文件夹"在存储桶中,通过不使用--body标志,而不指定文件名,并在--key标志中提供的路径的末尾加上斜杠,系统将在S3存储桶中创建所需的模拟文件夹结构无需在该过程中插入文件。

    希望这可以帮助您更好地了解系统。

    注意:一旦创建了"文件夹"结构,就可以使用S3的" sync"命令将后代"文件夹"与本地计算机上的文件夹甚至另一个S3存储桶同步。


    AWS:S3 rails gem本身就是这样做的:

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

    如果teaserimages"文件夹"尚不存在,将自动创建它们。


    在iOS(Objective-C)中,我按照以下方式进行操作

    您可以添加以下代码以编程方式在amazon s3存储桶中创建一个文件夹。这是工作代码段。任何建议欢迎。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -(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");
            }
        }];
    }


    使用aws cli,可以将整个文件夹复制到存储桶。

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

    还可以使用aws s3 sync同步文件夹


    使用AWS开发工具包.Net可以完美运行,只需在名称文件夹的末尾添加" /"即可:

    1
    2
    3
    4
    5
    6
    7
    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);

    然后刷新您的AWS控制台,您将看到该文件夹


    这是一个分歧性话题,因此这是2019年AWS S3控制台的屏幕快照,用于添加文件夹和注意事项:

    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.

    然后"使用编码",您可以通过在有效的文件夹名称字符串和正斜杠前添加前缀来简单地调整对象名称。

    Adding folders to S3


    对于Swift,我创建了一个方法,您在其中传递String作为文件夹名称。

    斯威夫特3:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    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
        })
    }

    然后打电话

    1
     createFolderWith(Name:"newFolder")

    这是您可以实现所需内容的方法(来自代码/ cli):

    1
    2
    3
    4
    5
    6
    7
    --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>/

    将会在s3存储桶上创建一个新文件夹,您现在可以执行cp,mv,rm ...语句,即照常管理该文件夹。

    如果不需要上面创建的这个新文件,只需删除它即可。现在,您已经创建了一个s3存储桶。


    我猜您的查询只是在folder(子文件夹)内创建一个文件夹。
    因此,在处理bucket子文件夹内的任何目录数据时,请使用如下命令。

    aws s3 cp mudit s3:// mudit-bucket / Projects-folder / mudit-subfolder-递归

    它将创建一个子文件夹并将其目录内容放入其中。同样,一旦您的子文件夹数据为空。您的子文件夹将自动被删除。


    以便在s3存储桶中创建目录并在其中复制内容非常简单。

    可以使用S3命令:
    aws s3 cp abc / def.txt s3:// mybucket / abc /

    注意:/是必须创建目录的目录,否则它将成为s3中的文件。


    下面创建了一个名为" mydir1"的空目录。

    下面是nodejs代码,其他语言应该类似。

    诀窍是在对象名称的末尾加上斜杠(/),例如" mydir1 /",否则将创建名称为" mydir1"的文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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"
             }
             */
        } });

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


    在Swift 2.2中,您可以使用以下方法创建文件夹

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    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
        })
    }

    您可以从可用的AWS开发工具包中选择所需的语言

    另外,您可以尝试为您的应用程序开发环境使用Python,Go,.Net,Java,Javascript中可用的minio客户端库,其中列出了示例目录,其中列出了所有基本操作。

    免责声明:我为Minio工作