我正在尝试在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中实现吗?
答案 0 :(得分:3)
Amazon S3中实际上不存在文件夹。这是一个平面对象存储系统。
例如,使用AWS Command-Line Interface (CLI),我可以将命令复制到Amazon S3存储桶:
aws s3 cp foo.txt s3://my-bucket/folder1/folder2/foo.txt
即使folder1
和folder2
不存在,这项工作也很好。这是因为对象使用{strong>包含对象的完整路径的Key
(文件名)进行存储。因此,上述对象实际上具有以下密钥(文件名):
folder1/folder2/foo.txt
但是,为了使人们更容易使用,Amazon S3管理控制台使它像出现文件夹一样显示。在S3中,它们称为通用前缀,而不是文件夹。
因此,当您在指定Prefix
的同时进行API调用以列出存储桶的内容时,它只会说“列出其键以此字符串开头的所有对象”。
您的清单未显示任何文件夹,因为它们实际上不存在。
现在,为了与我自己矛盾,实际上 可以创建一个文件夹(例如,通过在管理控制台中单击 Create folder )。实际上,这会创建一个与文件夹名称相同的长度为零的对象。该文件夹将出现在清单中,因为它实际上是在列出零长度对象而不是文件夹。
这可能就是为什么Item1/Item2/
出现在您的列表中而Item1/Item2/Item3
没有出现的原因。在某个阶段,某人必须“创建了一个名为Item1/Item2/
的文件夹”,该文件夹实际上使用该Key创建了一个零长度的对象。