我有拥有元数据的CloudBlockBlobs。
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"]);
现在稍后,如果我从存储查询,我会看到blob,但缺少元数据: (在下面我知道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"];
谢谢!
答案 0 :(得分:9)
您的代码存在一些问题:(。
blob.SetProperties()
方法,该方法仅设置blob的属性(示例中为ContentType
)。要设置元数据,您实际上需要调用blob.SetMetadata()
方法。您的上传代码目前正在对存储服务进行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的元数据,您应该能够看到它(提供的元数据已正确创建)。