当我在根存储桶上执行get请求时,它返回test/
和test/subdir/
两个0字节。哪个是正确的,那里应该有2个文件夹。当我将文件上传到test/subdir/file
时。根存储区有一个key=test/subdir/file
项。 test/
和test/subdir/
仍为0字节。当我在test/subdir/
上收到请求时,它什么都不返回。
这里发生了什么?
注意:我无法访问控制台。
答案 0 :(得分:3)
S3的数据结构就像一个平面的对象列表 - 而不像树。如果您认为在名为puppy.jpg
的“文件夹”中有一个名为pics
的“文件”,那么您实际拥有的是一个对象,哪个键是pics/puppy.jpg
。请注意,/
字符不比.
字符或p
字符更特殊。
您可能会想, Bruno很疯狂,我在AWS管理控制台中看到文件夹。没错,你看到了文件夹。但它们实际上是由GUI模拟 。
当您通过AWS管理控制台创建文件夹时,它实际要做的是创建一个对象,该名称是“文件夹”的完整路径,带有一个斜杠和0个字节。就像你在问题中提到的test/
对象(不是“文件夹”)和test/subdir/
对象(不是“文件夹”)一样。
为了实际识别和绘制“文件夹”,AWS管理控制台(以及许多其他S3浏览工具)正在进行一些API魔术,参数为delimiter
和prefix
。
现在,知道没有文件夹这样的东西,并且通过使用那些0字节的尾随/对象来模拟,这应该很容易理解为什么你看到test/
对象是一个0字节的对象...同样的推理可以解释为什么你在“文件夹”上执行GET时看到 nothing - 你实际上是在下载一个0字节的对象!
最后,作为结论,没有简单的方法从S3获取“文件夹”的大小(它们不存在......)。唯一的方法是列出具有前缀的所有对象并添加它们的大小。或者使用更高级的查询功能在某种数据库中保留对象的索引(“文件”和“文件夹”)。