使用aws-sdk gem列出所有来自s3的文件

3
我是一位有用的助手,可以翻译文本。
我有一个场景需要翻译。在我的情况下,aws s3文件夹结构如下所示。
- videos
  - my_videos
    - college

我已经上传了一个视频文件,名为myfirst_day.mp4,上传到了college目录中。与此相关的键值是"videos/my_videos/college/myfirst_day.mp4"
现在我需要列出videos/my_videos/college目录下的所有文件。 我该如何做呢?
我使用aws-sdk gem来实现这个功能。
1个回答

5
您可以简单地遍历bucket中的objects,并使用with_prefix方法。
s3.buckets[YOUR BUCKET NAME].objects.with_prefix('videos/my_videos/college').each.collect(&:key)
#=> ["videos/my_videos/college/myfirst_day.mp4"]

或者使用as_tree方法。

s3.buckets[YOUR BUCKET NAME].as_tree(prefix:'videos/my_videos/college').select(&:leaf?).collect(&:key)
 #=> ['videos/my_videos/college/myfirst_day.mp4']

显然,这些是虚构的,因为我无法访问您的存储桶,但请查看ObjectCollectionTree以获取更多AWSSDK中的方法。
有很多可用于存储桶遍历的方法,例如Tree响应children,其中将列出LeafNode(文件)和BranchNode(目录)。 然后,BranchNode也将响应children,因此如果需要,可以进行递归。
要获取suffix(例如仅文件名),您可以通过修改这些内容来完成。
class LeafNode
  def suffix
    @member.key.split(delimiter).pop
  end
end
class S3Object
  def suffix
    @key.split("/").pop
  end
end

我没有进行过完全的测试,但是如果文件嵌套在一个分支中,下面的内容应该可以返回文件名本身。


我正在做同样的事情。有没有办法只获取文件名,而不是整个路径? - theTuxRacer
@theTuxRacer,虽然有prefix方法,但我没有看到suffix方法,不过这很容易修补。我已经更新了我的答案以作澄清。 - engineersmnky
感谢您抽出时间回答我的问题。这就是最终我所做的 :) - theTuxRacer
1
@theTuxRacer 没问题。很高兴它对你有用,似乎这应该成为 gem 的一部分,因为我相信你不是唯一想要这个功能的用户。 - engineersmnky
嗨@engineersmnky,我看了这个回答,解释了为什么我们会得到OP。这是我第一次听说它,并在此发布,假设您也不知道:https://dev59.com/QnI-5IYBdhLWcg3wQWGc#20012200 如果不是这种情况,请原谅。谢谢。 - theTuxRacer
@theTuxRacer 不确定我理解这个评论的意思?list_objectsXML 格式作为 Core::Response 响应,因此你理论上可以使用它,尽管实现似乎更加复杂。 - engineersmnky

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