2015-09-05 157 views
1

我有具有元數據的CloudBlockBlobs。Azure存儲按元數據搜索Blob

CloudBlockBlob blockBlob = container.GetBlockBlobReference("myblob.jpg"); 

using (var fileStream = System.IO.File.OpenRead(filePath)) 
{ 
blockBlob.UploadFromStream(fileStream); 
blockBlob.Properties.ContentType = "image/jpg"; 
blockBlob.Metadata.Add("Title", "Yellow Pear"); 
blockBlob.SetProperties(); 
} 

我看到的元數據有:

Debug.WriteLine(blockBlob.Metadata["Title"]); 

現在,以後,如果我從存儲查詢我看到的斑點,但元數據丟失: (在下面,我知道blobItems [0]有元數據上傳,但現在blobItems [0] .Metadata.Count == 0)

var blobItems = container.ListBlobs(
    null, false, BlobListingDetails.Metadata); 

我也注意到了元數據不可用時,我本身獲得BLOB時:

CloudBlockBlob a = container.GetBlockBlobReference("myblob.jpg"); 
//Below throws an exception 
var b = a.Metadata["Title"]; 

謝謝!

回答

7

有一些問題,你的代碼:(。

  1. 團塊沒有任何元數據實際設置。設置後的元數據,你調用blob.SetProperties()方法,只設置BLOB的屬性(ContentType你需要調用blob.SetMetadata()方法
  2. 你的上傳代碼目前正在進行2次調用存儲服務:1)上傳blob和2)設置屬性。如果你打電話SetMetadata那麼它會是3個電話。恕我直言,這些都可以在短短1調用存儲服務通過執行類似下面結合:

    using (var fileStream = System.IO.File.OpenRead(filePath)) 
        { 
         blockBlob.Properties.ContentType = "image/jpg"; 
         blockBlob.Metadata.Add("Title", "Yellow Pear"); 
         blockBlob.UploadFromStream(fileStream); 
        } 
    

這不僅會上傳的blob,還設置它在一個調用存儲服務屬性和元數據。

關於

我也注意到了元數據不可用,當我通過 本身獲得的blob:

CloudBlockBlob a = container.GetBlockBlobReference("myblob.jpg"); 
//Below throws an exception 
var b = a.Metadata["Title"]; 

基本上上面的代碼只是建立在BLOB的實例客戶端。它實際上並未獲取blob的屬性(和元數據)。要獲取關於blob的詳細信息,您需要在blob上調用FetchAttributes方法。例如:

CloudBlockBlob a = container.GetBlockBlobReference("myblob.jpg"); 
a.FetchAttributes(); 

如果在此之後您檢索blob的元數據,您應該能夠看到它(提供元數據已正確創建)。

+0

解釋得非常好 - 謝謝! – mbird