AWS S3 Listing API-如何列出具有特定前缀的S3存储桶中的所有内容

时间:2019-06-12 21:41:28

标签: amazon-web-services go amazon-s3

我正在尝试在S3存储桶中列出所有带有特定prefix的项目。这是我拥有的目录结构:

Item1/
     Item2/
          Item3/
               Item4/
                     image_1.jpg
               Item5/
                     image_1.jpg
                     image_2.jpg

当我将prefex设置为Item1/Item2时,得到以下结果:

Item1/Item2/
Item1/Item2/Item3/Item4/image_1.jpg
Item1/Item2/Item3/Item5/image_1.jpg
Item1/Item2/Item3/Item5/image_2.jpg

我想得到的是:

Item1/Item2/
Item1/Item2/Item3
Item1/Item2/Item3/Item4
Item1/Item2/Item3/Item5
Item1/Item2/Item3/Item4/image_1.jpg
Item1/Item2/Item3/Item5/image_1.jpg
Item1/Item2/Item3/Item5/image_2.jpg

反正可以在golang中实现吗?

1 个答案:

答案 0 :(得分:3)

Amazon S3中实际上不存在文件夹。这是一个平面对象存储系统。

例如,使用AWS Command-Line Interface (CLI),我可以将命令复制到Amazon S3存储桶:

aws s3 cp foo.txt s3://my-bucket/folder1/folder2/foo.txt

即使folder1folder2不存在,这项工作也很好。这是因为对象使用{strong>包含对象的完整路径的Key(文件名)进行存储。因此,上述对象实际上具有以下密钥(文件名):

folder1/folder2/foo.txt

但是,为了使人们更容易使用,Amazon S3管理控制台使它像出现文件夹一样显示。在S3中,它们称为通用前缀,而不是文件夹。

因此,当您在指定Prefix的同时进行API调用以列出存储桶的内容时,它只会说“列出其键以此字符串开头的所有对象”。

您的清单未显示任何文件夹,因为它们实际上不存在。

现在,为了与我自己矛盾,实际上 可以创建一个文件夹(例如,通过在管理控制台中单击 Create folder )。实际上,这会创建一个与文件夹名称相同的长度为零的对象。该文件夹将出现在清单中,因为它实际上是在列出零长度对象而不是文件夹。

这可能就是为什么Item1/Item2/出现在您的列表中而Item1/Item2/Item3没有出现的原因。在某个阶段,某人必须“创建了一个名为Item1/Item2/的文件夹”,该文件夹实际上使用该Key创建了一个零长度的对象。