有人可以解释AWS GET吗?

时间:2014-12-26 19:57:13

标签: amazon-web-services amazon-s3

供参考:GET Bucket (List Objects)

当我在根存储桶上执行get请求时,它返回test/test/subdir/两个0字节。哪个是正确的,那里应该有2个文件夹。当我将文件上传到test/subdir/file时。根存储区有一个key=test/subdir/file项。 test/test/subdir/仍为0字节。当我在test/subdir/上收到请求时,它什么都不返回。

这里发生了什么?

注意:我无法访问控制台。

1 个答案:

答案 0 :(得分:3)

格雷格,起初这可能听起来很混乱,但事实是,亚马逊S3中没有“文件夹”这样的东西。我会解释一下。

S3的数据结构就像一个平面的对象列表 - 而不像树。如果您认为在名为puppy.jpg的“文件夹”中有一个名为pics的“文件”,那么您实际拥有的是一个对象,哪个键是pics/puppy.jpg。请注意,/字符不比.字符或p字符更特殊。

您可能会想, Bruno很疯狂,我在AWS管理控制台中看到文件夹。没错,你看到了文件夹。但它们实际上是由GUI模拟

当您通过AWS管理控制台创建文件夹时,它实际要做的是创建一个对象,该名称是“文件夹”的完整路径,带有一个斜杠和0个字节。就像你在问题中提到的test/对象(不是“文件夹”)和test/subdir/对象(不是“文件夹”)一样。

为了实际识别和绘制“文件夹”,AWS管理控制台(以及许多其他S3浏览工具)正在进行一些API魔术,参数为delimiterprefix

现在,知道没有文件夹这样的东西,并且通过使用那些0字节的尾随/对象来模拟,这应该很容易理解为什么你看到test/对象是一个0字节的对象...同样的推理可以解释为什么你在“文件夹”上执行GET时看到 nothing - 你实际上是在下载一个0字节的对象!

最后,作为结论,没有简单的方法从S3获取“文件夹”的大小(它们不存在......)。唯一的方法是列出具有前缀的所有对象并添加它们的大小。或者使用更高级的查询功能在某种数据库中保留对象的索引(“文件”和“文件夹”)。