2015-09-05 5 views
1

У меня есть CloudBlockBlobs, у которых есть метаданные.Azure Storage Поиск Blobs по метаданным

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(); 
} 

Я вижу Metadata есть:

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

Теперь позже, если я запрашиваю из памяти я вижу сгустки но Metadata отсутствует: (в ниже я знаю blobItems [0] было Метаданные при загрузке, но теперь blobItems [0] .Metadata.Count == 0)

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

Я также заметил, что метаданные не доступна, когда я получить блоб сам по себе:

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

Спасибо!

ответ

7

Есть некоторые проблемы с вашим кодом :(.

  1. блоб не имеет какого-либо набор метаданных на самом деле. После установки метаданных, вы вызываете blob.SetProperties() метод, который устанавливает свойства только блоб (в ContentType в вашем примере). Чтобы установить метаданные, вам действительно нужно вызвать метод blob.SetMetadata().
  2. Ваш код загрузки в настоящее время выполняет 2 вызова службы хранения: 1) загрузить blob и 2) установить свойства. Если вы вызовете SetMetadata, это будет 3 вызова. ИМХО, они могут быть объединены в только один вызов к службе хранения, делая что-то, как показано ниже:

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

Это позволит не только загружать каплю, но и установить его свойства и метаданные в одном вызове в службу хранения ,

Что касается

Я также заметил, что метаданные не доступна, когда я получить каплю самой :

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

В основном выше код просто создает экземпляр сгустка на клиентская сторона. На самом деле он не отображает свойства (и метаданные) blob. Чтобы получить сведения о блобе, вам нужно будет вызвать метод FetchAttributes на блобе. Что-то вроде:

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

Если после этого извлечь метаданные BLOb, вы должны быть в состоянии видеть его (при условии метаданных были созданы должным образом).

+0

Это объяснило это так хорошо - спасибо! – mbird

Смежные вопросы