【问题标题】:AWS Ruby SDK , check a key exists always gives 'false'AWS Ruby SDK,检查密钥是否存在总是给出“假”
【发布时间】:2020-05-31 16:50:36
【问题描述】:

在 AWS S3 中,我有一个名为 my-bucket 的存储桶,我正在使用 AWS Ruby SDK 访问我的存储桶。

my-bucket下我在S3中有如下目录结构(我知道在S3中不叫“目录”,只是为了说明一下):

my-bucket/
    customers/
         products/
              - data1.txt
              - data2.txt
              ...

我想检查 AWS Ruby SDK 是否存在 my-bucket/customers/products,我尝试了以下代码:

s3 = Aws::S3::Resource.new
bucket = s3.bucket("my-bucket")
result = bucket.object("customers/products").exists?

但是result 给出了false,即使我在 S3 中有那个目录,我哪里错了?

【问题讨论】:

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


    【解决方案1】:

    这是因为“客户/产品”不作为对象存在。它只是某些确实存在的对象的前缀。你说:

    我知道它在 S3 中不称为“目录”

    但是,它不仅仅是 S3 中目录的不同术语。 S3 中根本不存在目录(或文件夹)。只有带有键的对象。它就像一个单一的平面目录,您的文件名可以在其中包含斜杠字符。

    为了方便起见,大多数 S3 浏览应用程序会将键名中的斜杠解释为“目录”并以分层方式(如文件系统)显示对象,但这些目录/文件夹实际上并不存在于 S3 中。

    正如另一个答案中指出的那样,最好的办法是检查是否存在包含该前缀的任何对象。

    【讨论】:

    • Object 表示customers/products 中包含的对象,例如data.txt?
    • 对象表示文件,是的。
    【解决方案2】:

    使用 bucket.objects.with_prefix("customers/products").any?

    【讨论】:

    • 未定义方法any?
    • 也根据 aws 文档,对于引用存储桶使用 bucket = s3.buckets['bucket-name']
    • 完全错误`未定义的方法any?' for #<Aws::S3::Object:0x007f846d403960> (NoMethodError)
    • 从错误看来,您没有得到 <:s3::objectcollection> 而是一个对象,这就是为什么?没有抛出任何方法错误。尝试存在吗?在这种情况下。您是否也尝试将存储桶引用为上面的评论
    【解决方案3】:

    Ruby sdk V2 中,方法 with_prefix 未定义:

    给定一个带有如下键的对象:dir1/dir2/object.jpg

    试试下面的方法

    bucket.objects(prefix: 'dir1/dir2').any?
    

    或直接检查对象是否存在

    bucket.object('dir1/dir2/object.jpg').exists?
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 2014-09-14
      • 1970-01-01
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多