AWS Ruby SDK,检查存在的密钥总是给出错误的'

时间:2016-09-03 20:07:59

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

在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中有那个目录,我错了吗?

3 个答案:

答案 0 :(得分:3)

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

  

我知道它在S3中没有被称为“目录”

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

Ruby sdk V2 中,未定义方法with_prefix

提供了一个具有以下键的对象: dir1 / dir2 / object.jpg

尝试类似以下内容

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

或直接检查对象是否存在

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