Azure存储按元数据搜索blob



我有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"]);

现在以后,如果我从存储查询,我看到blobs,但元数据缺失:(在下面我知道blobItems[0]有元数据时上传,但现在blobItems[0].元数据。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"];

谢谢!

你的代码有一些问题:(.

  1. blob实际上没有任何元数据集。设置元数据后,调用blob.SetProperties()方法,该方法只设置blob的属性(在您的示例中为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);
        }
    

这不仅会上传blob,还会在对存储服务的单个调用中设置它的属性和元数据。

关于

我还注意到元数据是不可用的,当我获得blob by本身:

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的元数据,您应该能够看到它(前提是元数据已正确创建)

最新更新