创建空文件夹S3 ruby​​ SDK

时间:2015-03-16 20:17:24

标签: ruby amazon-web-services amazon-s3 aws-sdk

我想使用ruby sdk在亚马逊S3中创建一个空文件夹。我读过S3中没有文件夹概念,所以理论上创建一个文件夹,你只需创建一个带有尾随“/”的空对象

s3 = Aws::S3::Client.new( region: 'eu-west-1',
                          credentials: creds)

s3.put_object(bucket: "my_bucket",
              key: "my_folder/")

这样做会在我的存储桶上创建一个空对象,但如果我尝试上传这样的文件:

s3.put_object(bucket: "my_bucket",
              key: "my_folder/myfile")

它不会在my_folder中创建文件。它维护旧的空对象,并创建一个文件夹和一个文件。因此,在两个命令之后,桶结构是:

my_bucket/
  my_folder
  my_folder/
    my_file 

为什么会这样?为什么它会创建对象my_folder两次?我应该如何创建一个空文件夹供以后使用?

3 个答案:

答案 0 :(得分:10)

当任何密钥包含'/'时,Amazon S3虚拟文件夹就会存在。在S3控制台中浏览存储桶时,它会扫描对象键以查找公共前缀,然后使用该前缀显示存储桶的子集。

给出以下对象键:

  • 照片/家庭/ reunion.jpg
  • 照片/家庭/ vacation.jpg
  • 视频/ funny.mp4

然后,亚马逊S3会显示顶级文件夹“照片”和“视频”。如果删除“videos / funny.mp4”对象,则“视频”目录将消失。

答案 1 :(得分:2)

正如你所说,S3没有文件夹的概念,"空"或者不是,它只有对象可以有" /"在它们中模仿文件系统中文件夹的命名约定。

" my_folder"没有被处理两次,只有两个名称开头的对象" my_folder /"。

如果你想坚持使用这种范式的文件夹,那么你必须要做的事情就是删除你的" my_folder /"对象一创建第一个" my_folder / *"对象

你真的不应该问,"我应该如何创建一个空文件夹供以后使用?"当您确认文件夹不存在时。

答案 2 :(得分:1)

S3表现如预期。它不支持文件夹。当您创建名为my_folder/myfile的文件时,S3会使用键my_folder/myfile创建对象。 "文件夹"的想法围绕带前缀的访问构建。这样,您可以在"文件夹"中列出对象。那样:

bucket.objects.with_prefix('my_folder').collect(&:key)
# => ["my_folder/myfile"]