GET BUCKET请求不一致

时间:2013-08-22 20:54:21

标签: google-cloud-storage

我在同一个文件夹中列出文件夹内容时注意到不同的结果,具体而言,有时 home 文件夹将列在“内容”部分下(在键<中) / em>元素),但其他时候没有。请参阅以下两个输出:

此输出不包含前缀目录

<?xml version='1.0' encoding='UTF-8'?>
<ListBucketResult xmlns='http://doc.s3.amazonaws.com/2006-03-01'>
<Name>
test22</Name>                            <=== Bucket
<Prefix>
16-Jul-2013</Prefix>                     <=== Prefixed folder
<Marker>
</Marker>
<IsTruncated>
false</IsTruncated>
<Contents>
<Key>
16-Jul-2013/0371.txt</Key>               <=== ONLY OBJECTS LISTED
<Generation>
1374016944689000</Generation>
<MetaGeneration>
1</MetaGeneration>
<LastModified>
2013-07-16T23:22:24.664Z</LastModified>
<ETag>
"5d858b3ddbf51fb5ec4501799e637b47"</ETag>
<Size>
96712</Size>
<Owner>
<ID>
00b4903a97d860d9d5a7d98a1c6385dc6146049499b88ceae217eaee7a0b2ff4</ID>
</Owner>
</Contents>

但此输出

<?xml version='1.0' encoding='UTF-8'?>
<ListBucketResult xmlns='http://doc.s3.amazonaws.com/2006-03-01'>
<Name>
test22</Name>                            <=== Bucket
<Prefix>
22-Aug-2013</Prefix>                     <=== Prefixed folder
<Marker>
</Marker>
<IsTruncated>
false</IsTruncated>
<Contents>
<Key>
22-Aug-2013/</Key>                       <=== FOLDER INCLUDED IN LIST
<Generation>
1377178774399000</Generation>
<MetaGeneration>
1</MetaGeneration>
<LastModified>
2013-08-22T13:39:34.337Z</LastModified>
<ETag>
"d41d8cd98f00b204e9800998ecf8427e"</ETag>
<Size>
0</Size>
<Owner>
<ID>
00b4903a97d0b7e1f638009476bba4c5d964f744e50c23c3681357a290cb7b16</ID>
</Owner>
</Contents>

这两个请求都是使用以下代码进行的(注意我没有使用经过身份验证的会话,这些项目是pubilc可读的):

uri = URI('https://storage.googleapis.com/test22?prefix=16-Jul-2013')     <=== prefix changed for each case
req3 = Net::HTTP::Get.new(uri.request_uri)

#req3['Authorization'] = "#{token['token_type']} #{token['access_token']}"
req3['Content-Length'] = 0
req3['content-Type'] = 'text/plain - GB'
req3['Date'] = Time.now.strftime("%a, %d %b %Y %H:%M:%S %Z")
req3['Host'] = 'storage.googleapis.com'
req3['x-goog-api-version'] = 2
req3['x-goog-project-id'] = ###############

Net::HTTP.start(uri.host, uri.port, :use_ssl => uri.scheme == 'https') { |http|
   resp3 = http.request(req3)
   puts resp3.body.gsub(/>/, ">\n")
}

为何与众不同?有什么基本的东西我不见了吗? 提前谢谢......

-Lee

1 个答案:

答案 0 :(得分:2)

使用Cloud Console创建文件夹时,它会创建一个占位符对象,其文件夹名称为+'/'以表示空文件夹。即使您稍后将对象添加到文件夹,占位符仍然存在。

另一方面,如果您使用API​​直接上传名称中带有“/”的对象(例如上传到'folder / object.txt'),则不会创建占位符对象,因为该对象的存在足以推断文件夹的存在。如果删除'folder / object.txt',则该文件夹将不再列在Cloud Console的根列表中,因为没有占位符对象。

要明确回答您的问题,这意味着'16 -Jul-2013 / 0371.txt'是通过直接上传到'16 -Jul-2013 / 0371.txt'创建的。相比之下,'22 -Aug-2013 /'是由云控制台中的“新建文件夹”按钮创建的。在后一种情况下,创建占位符对象,在前者中,它不是。

所有这一切都是因为GCS名称空间是扁平的,而不是分层的。文件夹抽象可以帮助您按层次结构对事物进行可视化,但它有一些限制。