在他们的SDK的第1版中,亚马逊提供了一些非常有用的方法,可以使用Tree,ChildCollection,LeafNode,BranchNode等来探索存储桶的内容。不幸的是,我很难复制他们的SDK版本2的功能,似乎不包括这些方法。理想情况下,我想做类似于下面示例的操作,该示例取自the v1 SDK。
tree = bucket.as_tree
directories = tree.children.select(&:branch?).collect(&:prefix)
#=> ['photos', 'videos']
files = tree.children.select(&:leaf?).collect(&:key)
#=> ['README.txt']
关于如何实现这一目标的任何想法?
答案 0 :(得分:5)
树和分支功能通过在带有前缀和分隔符的存储桶中列出对象来工作。前缀指定当前"文件夹"并且分隔符应该是' /'防止返回嵌套键。
例如,列出所有"文件"和"文件夹"在"照片/家庭/"桶的文件夹:
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_prefix是目录。如果您想继续查看"照片/家庭/肖像/"中的文件和文件夹,然后再使用不同的前缀再次#list_objects
:
resp = s3.list_objects(bucket:'bucket-name', prefix:'photos/family/portraits/', delimiter:'/')