【问题标题】:create empty folder S3 ruby SDK创建空文件夹 S3 ruby​​ SDK
【发布时间】:2015-03-17 14:05:26
【问题描述】:

我想使用 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 中创建文件。它维护旧的空对象,并创建一个文件夹和一个文件。所以在这两个命令之后bucket结构是:

my_bucket/
  my_folder
  my_folder/
    my_file 

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

【问题讨论】:

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


    【解决方案1】:

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

    给定以下对象键:

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

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

    【讨论】:

    • 我的结局不是这样的。即使删除文件夹中的所有文件后,我仍然可以在 AWS 控制台中看到该文件夹​​!我错过了什么?
    • S3 控制台可能正在使用键“vidoes/”创建一个空对象(例如)。如果您使用 SDK,则会显示此文件夹对象。它仍然是一个和其他对象一样的对象,只是有一个特殊的命名约定。
    【解决方案2】:

    正如你所说,S3 没有文件夹的概念,无论是否“空”,它只是包含可以在其中包含“/”的对象,以模仿文件系统中文件夹的命名约定。

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

    如果您想坚持这种没有文件夹的范例,您必须在创建第一个“my_folder/*”后立即删除您的“my_folder/”对象" 对象。

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

    【讨论】:

      【解决方案3】:

      S3 的行为符合预期。它不支持文件夹。当您创建名称为 my_folder/myfile 的文件时,S3 会创建带有键 my_folder/myfile 的对象。 “文件夹”的概念是围绕带有前缀的访问而构建的。因此,您可以像这样在“文件夹”中列出对象:

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

      【讨论】:

        猜你喜欢
        • 2019-08-16
        • 2022-01-26
        • 2020-11-02
        • 2021-07-14
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多