Google cloud storage GET BUCKET请求中的不一致性

Google cloud storage GET BUCKET请求中的不一致性,google-cloud-storage,Google Cloud Storage,当在同一个bucket中列出文件夹的内容时,我注意到了不同的结果,特别是,有时主文件夹会列在“contents”部分(在key元素中),但有时不会。见以下两个输出: 此输出不包括前缀目录 <?xml version='1.0' encoding='UTF-8'?> <ListBucketResult xmlns='http://doc.s3.amazonaws.com/2006-03-01'> <Name> test22</Name>

当在同一个bucket中列出文件夹的内容时,我注意到了不同的结果,特别是,有时主文件夹会列在“contents”部分(在key元素中),但有时不会。见以下两个输出:

此输出不包括前缀目录

<?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>


test22使用云控制台创建文件夹时,它会创建一个占位符对象,名称为文件夹+“/”以表示空文件夹。即使以后将对象添加到文件夹中,占位符也会保留

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

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


所有这一切都是因为GCS命名空间是平面的,而不是分层的。文件夹抽象是为了帮助您分层地可视化事物,但它有一些限制。

您能告诉我们您在这两种情况下使用的API请求吗?(请去掉Authorization:header)是否可能您的bucket中有一个名为“22-Aug-2013/”的对象,并附加了斜杠?API请求。关于将一个对象命名为与目录号相同的问题,我确实进行了检查。这不是仅有的两个这样运行的目录,还有另一个目录也显示了homedir,尽管其中一个是空的,但上面示例输出中的一个不是空的。我认为很可能是在某个地方创建了一个带有“22-Aug-2013/”的对象,因为GCS只存储对象的生成(而不是前缀)显然,一代人正在回归。有两个问题可以帮助理解:首先,在您的评论中,您提到示例输出不是空目录。您的意思是说有些对象(如2013年8月22日/somefile.txt)没有列出吗?其次,在上面的示例中,如果您访问“storage.googleapis.com/test22/22-Aug-2013/”;您看到返回了什么数据?特拉维斯,感谢您的跟进,关于您的问题:1)不,存储的所有对象实际上都列出了,我的意思是,这种奇怪的行为似乎与空目录(或GCS可能称之为文件夹)无关。除了查看云控制台之外,我不知道该说什么,我可以验证2013年8月22日的文件夹是否为空,文件夹中所有对象的列表是否包含属性下的文件夹名称(如上所示)2013年8月16日文件夹的类似列表仍然没有列出与其兄弟文件夹不同的文件夹…这是一个非常好的解释,它也解释了我看到的“不一致”的原因。谢谢
<?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>
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")
}