1

同じバケット内のフォルダーのコンテンツを一覧表示すると、結果が異なることに気付きました。具体的には、ホームフォルダーが [コンテンツ] セクション (キー要素内) の下に一覧表示される場合とそうでない場合があります。次の 2 つの出力を参照してください。

この出力には、プレフィックス付きのディレクトリは含まれません

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

両方のリクエストは、次のコードで行われました (認証されたセッションを使用しなかったことに注意してください。項目は公開されています)。

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")
}

違いはなぜですか?私が見逃している基本的なものはありますか?前もって感謝します...

-リー

4

1 に答える 1

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/」は、Cloud Console の [新しいフォルダ] ボタンによって作成されました。後者の場合、プレースホルダー オブジェクトが作成されますが、前者の場合は作成されません。

これはすべて、GCS 名前空間が階層的ではなくフラットであるためです。フォルダーの抽象化は、物事を階層的に視覚化するのに役立ちますが、いくつかの制限があります。

于 2013-08-29T21:33:27.660 に答える