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

36

我想在我的Amazon S3存储桶中使用编码添加文件夹。 你能给我建议怎样实现这个目标吗?

16个回答

47

Amazon S3中没有文件夹的概念,但是大多数可用的S3浏览器工具会将键名中被斜线分隔的部分显示为文件夹。

如果你确实需要文件夹的效果,可以创建一个以斜线结尾的空对象,例如"folder/"。在GUI工具和AWS控制台中打开它时,它看起来像一个文件夹。


8
这对我来说看起来像是文件夹? - Nate

26

正如其他人所说,在AWS S3中没有"文件夹",你对它们的理解是错误的。AWS S3有"对象",这些对象看起来像文件夹,但并不完全是文件夹的意思。如果你在Amazon AWS S3上寻找创建文件夹的方法,你不会找到太多好的结果。

有一种方法可以创建"文件夹",就是在S3上创建模拟文件夹结构,但同样要明白的是,你是在S3中创建对象,而不是文件夹。为此,你需要使用命令"put-object"来创建这个模拟文件夹结构。现在,为了使用这个命令,你需要安装AWS CLI工具,请参考AWS CLI Installation了解更多信息。

这个命令如下:

aws s3api put-object --bucket your-bucket-name --key path/to/file/yourfile.txt --body yourfile.txt
现在,这个命令有趣的地方是,你不需要在运行此命令之前创建所有的“文件夹”(对象)。这意味着你可以有一个“文件夹”(对象)来包含其他东西,然后你可以使用此命令在该“文件夹”(对象)中创建模拟的文件夹结构,就像我之前讨论过的那样。例如,我有一个名为“importer”的“文件夹”(对象)在我的S3存储桶中,假设我想将sample.txt插入到年、月和一个示例“文件夹”(对象)的目录结构中。
如果我只有存储桶中的“importer”对象,那么在运行此命令之前,我不需要先创建年份、月份和示例对象(“文件夹”)。我可以像这样运行此命令:
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标志,不指定文件名,并在提供的路径末尾留下一个斜杠,系统将在不插入文件的情况下在S3存储桶中创建所需的模拟文件夹结构。

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

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


1
我意识到这个问题已经死了一段时间,但我从来没有找到一个令人满意的答案来回答这个问题,直到我偶然发现了正确的术语,并尝试使用一些shell脚本,最终我弄清楚了如何做到这一点。因此,我想为任何需要知道如何做到这一点的人提供一个真正的答案。 - Jravict
相关(对于那些想知道各种可用的s3 cli,例如s3 vs s3api):https://dev59.com/k18d5IYBdhLWcg3w41gp#26396150。 对于许多任务来说,使用aws s3可能更容易安装和使用,例如将本地pwd中的所有文件复制到远程:aws s3 sync . s3://my-bucket - michael
CLI示例,添加尾随斜杠并省略正文:aws s3api put-object --bucket my-bucket --key folder/ - Robert Chen

18

Java和AWS SDK:

  1. S3中没有文件夹,只有键/值对。 键可以包含斜杠(/),这将使其在管理控制台中显示为文件夹,但在编程上它不是文件夹,而是一个字符串值。

  2. 如果您想构建S3存储桶的结构,则可以使用常规目录模式简单地命名约定(您给文件的键),例如 folder/subfolder/file.txt

    当搜索时(取决于您使用的语言),您可以通过前缀和分隔符搜索。 在Java中,它将是一个 listObjects(String storageBucket, String prefix, String delimiter) 方法调用。

    storageBucket 是您的存储桶名称,prefix 是您要搜索的键,delimiter 用于基于 prefix 过滤搜索结果。


9

AWS:S3 Rails宝石自己完成此操作:

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

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

6
使用AWS SDK .Net非常完美,只需在文件夹名称末尾添加“/”即可:
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控制台,您将看到文件夹


3
使用AWS命令行界面(CLI),可以将整个文件夹复制到存储桶中。
aws s3 cp /path/to/folder s3://bucket/path/to/folder --recursive

您还可以使用aws s3 sync选项来同步文件夹。


1
对我来说,关键是将文件夹名称也放入目标位置。 - xdhmoore

3

这是一个具有争议性的话题,因此以下是2019年AWS S3控制台添加文件夹的截图,并附注:

当您创建文件夹时,S3控制台会创建一个对象,该对象名称末尾附加上述后缀“ / ”,并且此对象在S3控制台中显示为文件夹。

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

向S3添加文件夹


2

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

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
    })
}

然后只需调用。
 createFolderWith(Name:"newFolder")

1
在iOS(Objective-C)中,我按照以下方式操作:
您可以添加以下代码以通过编程方式在Amazon S3存储桶内创建文件夹。这是有效的代码片段。欢迎任何建议。
-(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");
        }
    }];
}

除了代码之外的一些解释会使这个答案更有用。 - Tot Zam

1

以下是如何通过代码/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>/

在您的S3存储桶上将创建一个新文件夹,您现在可以执行cp、mv、rm等语句,即像往常一样管理该文件夹
如果不需要上述新创建的文件,请直接删除。现在您已经创建了一个S3存储桶。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接