Azure 存储按元数据搜索 Blob
Azure Storage Search Blobs by Metadata
我有具有元数据的 CloudBlockBlob。
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"];
谢谢!
您的代码存在一些问题:(。
- 该 blob 实际上没有任何元数据集。设置元数据后,您将调用
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,还会在对存储服务的一次调用中设置它的属性和元数据。
关于
I also noticed the Metadata is not available when I obtain the blob by
itself:
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 的元数据,您应该能够看到它(前提是元数据已正确创建)。
我有具有元数据的 CloudBlockBlob。
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"];
谢谢!
您的代码存在一些问题:(。
- 该 blob 实际上没有任何元数据集。设置元数据后,您将调用
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,还会在对存储服务的一次调用中设置它的属性和元数据。
关于
I also noticed the Metadata is not available when I obtain the blob by itself:
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 的元数据,您应该能够看到它(前提是元数据已正确创建)。