亚马逊AWS:如何在AWS Ruby SDK v2中复制AWS Ruby SDK v1的树/分支功能?

3

在Amazon的SDK版本1中,提供了一些非常有用的方法,可以使用Tree、ChildCollection、LeafNode、BranchNode等来探索桶的内容。不幸的是,在版本2的SDK中,我很难复制他们的功能,因为它似乎没有包含这样的方法。理想情况下,我想做类似于下面的例子,它取自v1 SDK

tree = bucket.as_tree

directories = tree.children.select(&:branch?).collect(&:prefix)
#=> ['photos', 'videos']

files = tree.children.select(&:leaf?).collect(&:key)
#=> ['README.txt']

有什么办法可以实现这个吗?
1个回答

5
树形和分支功能是通过在存储桶中列出具有前缀和分隔符的对象来实现的。前缀指定当前“文件夹”,分隔符应为'/',以防止返回嵌套键。
例如,要列出存储桶中“photos/family/”文件夹内的所有“文件”和“文件夹”:
s3 = Aws::S3::Client.new
resp = s3.list_objects(bucket:'bucket-name', prefix:'photos/family/', delimiter:'/')

# the list of "files"
resp.contents.map(&:key)
#=> ['photos/family/summer_vacation.jpg', 'photos/family/parents.jpg']

# the list of "folders"
resp.common_prefixes
#=> ['photos/family/portraits/', 'photos/family/disney_land/']

这些内容是响应中的文件或叶节点。common_prefixes则是目录。如果您想继续查看“photos/family/portraits/”内部的文件和文件夹,只需使用不同的前缀再次执行#list_objects

resp = s3.list_objects(bucket:'bucket-name', prefix:'photos/family/portraits/', delimiter:'/')

获取文件夹应该使用"resp.common_prefixes"而不是"resp.contents.common_prefixes"。 - Julien
好的发现!示例更新,无需额外的“内容”调用。 - Trevor Rowe
注意:list_objects 函数最多只会返回1000个“文件”或“文件夹”,除非您添加额外的代码进行分页。 - wjordan

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