【问题标题】:How to list all files in an s3 folder using AWS-SDK gem in ruby on rails如何在 ruby​​ on rails 中使用 AWS-SDK gem 列出 s3 文件夹中的所有文件
【发布时间】:2013-10-23 22:45:56
【问题描述】:

我想显示一个 s3 文件夹中所有文件的列表,以便我可以获取所有最后修改的日期,以便确定哪些文件已更改。

我尝试使用 objects.with_prefix('Folder1') 它给了我一个完整的列表,但也包含 Folder1.1 键

我不知道我是否需要使用分隔符,但我找不到任何如何在 aws sdk 中使用分隔符。

提前非常感谢!

我正在使用“aws-sdk”gem

这是我的存储桶结构 -文件夹 1 -文件1 -文件2 -文件夹.1.1

这是我的代码

bucket = s3.buckets[bucket_name]
data = bucket.objects.with_prefix('Folder1/')
data.each do |object|
    puts "#{object.key}\t#{object.last_modified}";
end

【问题讨论】:

  • 你找到解决方案了吗?
  • 这里没有一个答案比结果的第一页多。如果您有超过 1000 个对象,这将返回不完整的结果。
  • @radiospiel 是对的。如果要获取超过前 1000 个对象,则需要 iterate through the pages of results

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


【解决方案1】:

答案为时已晚,但总比没有好。

你可以的

s3_bucket.objects.with_prefix('folder_name').collect(&:key)

根据官方文档here

更新: SDK V3

s3 = Aws::S3::Client.new
resp = client.list_objects_v2({
  bucket: "BucketName", # required
  prefix: "FolderName", 
})

【讨论】:

  • 第 2 版是:s3_bucket.objects(prefix: 'folder_name').collect(&:key)
【解决方案2】:

您可以使用这段小代码来获取特定文件夹的文件列表。

 s3 = Aws::S3::Resource.new(region: 'ap-southeast-1', access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'] )
 data_files = s3.bucket(bucket_name).objects(prefix: 'prefix/', delimiter: 'delimiter').collect(&:key)

【讨论】:

  • 如果要获取所有带前缀的键,指定什么作为分隔符。我不想用任何东西划界。
【解决方案3】:

https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#list_objects_v2-instance_method

SDK V3 有客户端前缀选项!

resp = client.list_objects_v2({ bucket: "BucketName", # required prefix: "FolderName", })

【讨论】:

    【解决方案4】:

    目前我也遇到了这个问题。到目前为止的解决方案是获取所有对象并稍后过滤它们:

    data = bucket.objects(bucketname, prefix: 'Folder1')
    
    data_without_folders = data.select { |obj| !(obj.key =~ /\/$/) }
    

    对于分隔符,您只需在 bucket.objects 调用中传递它,如下所示:

    data = bucket.objects(bucketname, prefix: 'prefix', delimiter: 'delimiter') 
    

    如果有更好的解决方案,我会告诉你的。

    【讨论】:

      【解决方案5】:

      让我们记住,S3 不是文件系统,所以即使“文件夹/”也是一个对象。

      现在,如果您想获取特定路径的文件,可以使用 start_after。例如,如果您的 S3 存储桶中有一个这样的对象列表。

      pictures/
      pictures/horse.jpg
      pictures/dog.jpg
      pictures/cat.jpg
      lion.jpg
      

      您可以通过执行以下操作从图片/路径中获取所有图片:

       s3 = Aws::S3::Resource.new(region: 'ap-southeast-1', access_key_id: ENV['AWS_ACCESS_KEY_ID'], secret_access_key: ENV['AWS_SECRET_ACCESS_KEY'] )
       pictures = s3.bucket(bucket_name).objects(prefix: 'pictures/', delimiter: '', start_after: 'pictures/').collect(&:key)
      

      输出将只有所有图片键,没有文件夹/:

      • 图片/horse.jpg
      • 图片/dog.jpg
      • 图片/cat.jpg

      【讨论】:

        猜你喜欢
        • 2014-06-16
        • 2011-03-28
        • 2013-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-07
        • 1970-01-01
        相关资源
        最近更新 更多