【问题标题】:Check if folder exist in s3 bucket检查 s3 存储桶中是否存在文件夹
【发布时间】:2016-11-12 02:59:30
【问题描述】:

如何使用 Ruby on Rails 检查我的 s3 存储桶中是否存在某个文件夹?

我正在使用 AWS:S3 官方 gem 初始化全局连接后

AWS::S3::Base.establish_connection!(:access_key_id => 'my_key_id', :secret_access_key => ‘my_secret’) 

我的存储桶名为:myfirstbucket

里面的文件夹命名为:my_folder

my_folder 中的文件名为:my_pic.jpg

当我尝试检查 my_pic.jpg 是否存在时,它工作得很好

s3object.exists? “/my_folder/my_pic.jpg” , “myfirstbucket”
=>  True

如何只检查文件夹是否存在?

s3object = AWS::S3::S3Object
s3object.exists? “/my_folder/” , “myfirstbucket”
=>  False

【问题讨论】:

标签: ruby ruby-on-rails-3 ruby-on-rails-4 amazon-s3


【解决方案1】:

使用Bucket#objects:

bucket.objects({prefix: 'my/folder/'}).limit(1).any?

返回CollectionObjectSummary 资源。没有 API 请求 直到你在集合上调用一个可枚举的方法。 Client#list_objects 将被多次调用,直到每次 ObjectSummary 已生成。

http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Bucket.html#objects-instance_method

【讨论】:

  • 这似乎是测试这种情况的唯一可能方法,因为文件夹“foo/”从技术上讲在 S3 中从未“存在”。文件夹的“存在”实际上是由键前缀匹配“foo/”的对象的存在来定义的。
  • 是的。或者很少或很难找到关于如何通过 API 访问用户可以创建并通过 AWS S3 控制台保留的占位符“目录”的文档。这是一篇关于 v1 的有趣文章:deadprogrammersociety.blogspot.com/2008/01/…
  • 我们也可以直接调用S3::Client#list_objects_v2resp = client.list_objects_v2(bucket: 'yourBucket', prefix: 'your/folder/', max_keys: 1)resp.contents.any?
【解决方案2】:

你必须检查

  1. 存在带有斜杠“/”的对象键
  2. 如果不存在,目录中是否有项目?

例如: 您在文件夹“my_folder”下有文件“my_file”。 AWS S3 记录 my_folder/my_file 将存在,但 my_folder/ 可能不存在。

所以你必须检查两次

if bucket.object("my_folder/").exists?
  true
else
  bucket.objects({prefix: "my_folder/"}).limit(1).any?
end

查看文档:http://docs.aws.amazon.com/AmazonS3/latest/UG/FolderOperations.html

【讨论】:

    【解决方案3】:

    你可以用你的桶做一棵树。

    http://docs.aws.amazon.com/AWSRubySDK/latest/AWS/S3/Tree.html

    tree = bucket.as_tree
    tree.children.select(&:branch?).collect(&:prefix).include?(“/my_folder/”)
    

    【讨论】:

    • 在 php 中进行相同活动的方式是什么?
    猜你喜欢
    • 2020-06-14
    • 2022-11-06
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    • 2019-11-10
    • 2023-03-14
    • 2020-11-06
    • 2013-09-06
    相关资源
    最近更新 更多