如何在 ruby on Rails 中使用 AWS-SDK gem 列出 s3 文件夹中的所有文件

问题描述 投票:0回答:5

我想显示 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
ruby-on-rails ruby amazon-s3
5个回答
43
投票

回答太晚了,但总比不回答好。

你可以做

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

根据官方文档这里

更新: SDK V3

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

17
投票

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

 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)

8
投票

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", 
})


3
投票

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

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

data_without_folders = data.select { |obj| !(obj.key =~ /\/$/) }

对于分隔符,您只需将其传递到存储桶中即可。对象调用如下:

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

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


1
投票

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

现在如果你想获取特定路径的文件,你可以使用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)

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

  • 图片/马.jpg
  • 图片/狗.jpg
  • 图片/cat.jpg
© www.soinside.com 2019 - 2024. All rights reserved.