如何使用Ruby中的Fog列出S3文件夹中的所有文件

23

如何使用Fog列出特定S3“目录”中的所有文件?

我知道S3不会将文件存储在文件夹中,但我需要一种方法来限制返回的文件只能是特定的“文件夹”,而不是检索存储桶中的整个列表。

1个回答

41

在 directory.get 方法中使用 prefix 选项。示例:

def get_files(path, options)
  connection = Fog::Storage.new(
    provider: 'AWS',
    aws_access_key_id: options[:key],
    aws_secret_access_key: options[:secret]
  )
  connection.directories.get(options[:bucket], prefix: path).files.map do |file|
    file.key
  end
end

1
值得注意的是,从结构上讲,“前缀”实际上是“后缀”。如果您嵌套桶的路径为“foo/bar”,则您的方法调用将是:.get('foo', prefix: 'bar') - pdoherty926
如果您不将存储桶名称视为路径的一部分,pdoherty926的注释可能有点令人困惑。 - Amir
2
这里有一个边缘情况,调用.map不会返回所有内容,而只会返回AWS API返回的单个页面。在文件上调用.each将让Fog管理内存消耗,因为可能有很多文件。 - rposborne
1
@rposborne 说得好。我认为在处理非常大的文件夹时,使用.each并传递一个块来处理文件是处理这种情况的最佳模式。 - Gerry Shaw
嗨,我知道这已经过时了,但是有人知道如何控制排序顺序吗?我使用UUID作为我的文件名,并意识到它按字母顺序返回而不是按上传时间排序:( - chrisallick
请确保从“prefix”路径中省略前导斜杠“/”,否则会返回一个看似为空的目录。 - Ollie Bennett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接