Azure存储按元数据搜索Blob

mbi*_*ird 2 azure azure-storage-blobs

我有拥有元数据的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();
}
Run Code Online (Sandbox Code Playgroud)

我看到元数据在那里:

Debug.WriteLine(blockBlob.Metadata["Title"]);
Run Code Online (Sandbox Code Playgroud)

现在稍后,如果我从存储查询,我会看到blob但缺少元数据:(在下面我知道blobItems [0]上传时有元数据,但现在blobItems [0] .Metadata.Count == 0)

var blobItems = container.ListBlobs(
    null, false, BlobListingDetails.Metadata);
Run Code Online (Sandbox Code Playgroud)

我还注意到,当我自己获取blob时,元数据不可用:

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

谢谢!

Gau*_*tri 9

您的代码存在一些问题:(.

  1. blob实际上没有任何元数据集.设置元数据后,您将调用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);
        }
    
    Run Code Online (Sandbox Code Playgroud)

这不仅会上传blob,还会在一次调用存储服务时设置它的属性和元数据.

关于

我还注意到,当我自己获取blob时,元数据不可用:

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

基本上上面的代码只是在客户端创建blob的一个实例.它实际上并不获取blob的属性(和元数据).要获取有关blob的详细信息,您需要FetchAttributes在blob上调用方法.就像是:

CloudBlockBlob a = container.GetBlockBlobReference("myblob.jpg");
a.FetchAttributes();
Run Code Online (Sandbox Code Playgroud)

如果之后您检索blob的元数据,您应该能够看到它(提供的元数据已正确创建).