是否可以在Azure中为blob添加其他信息?
我想存储一些相关信息,这些信息将blob连接到文档数据库中的其他实体,例如,包含JSON的字符串。
我知道使用Azure存储资源管理器时会有blob的元数据,但是我想从代码中使用它。
这是与此主题相关的问题: Adding Description/Metadata to Azure Blob
又如何基于此元数据检索blob?
答案 0 :(得分:4)
您检查了此link吗?
public static async Task AddContainerMetadataAsync(CloudBlobContainer container)
{
// Add some metadata to the container.
container.Metadata.Add("docType", "textDocuments");
container.Metadata["category"] = "guidance";
// Set the container's metadata.
await container.SetMetadataAsync();
}
请记住
您的元数据名称必须符合C#标识符的命名约定。
答案 1 :(得分:-1)
问题的第一部分由Mihail Stancescu回答,谢谢!
第二部分尚未正确回答。 Azure搜索是针对它的解决方案,但它完全是另一项服务。我想在我的存储库类中解决此问题。我解决了。
也许对其他人来说很有趣,这就是为什么我分享自己的解决方案:
解决方案的背后 AzureBlob中有一个字符串类型的元数据。我将一个对象序列化为String并将此字符串存储在元数据中。无论何时需要此信息,我都会在其中列出带有元数据的信息。我通过将此 Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails.Metadata 值传递给 ListBlobs 函数中的 blobListingDetails 参数来实现此功能。
当Blob到达时,我立即从JSON反序列化为对象。该机制在LINQ Select中可见:
.Select<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob, T>(blob = > JsonConvert.DeserializeObject<T>(blob.Metadata["data"]))
此后,LINQ类型为T,因此我可以在LINQ Where上对其应用表达式。
完整的解决方案是:
GetMany函数
public IEnumerable<T> GetMany( Expression<Func<T, bool>> filter )
{
return _AzureBlobCollection.BlobDirectory
.ListBlobs( useFlatBlobListing: false, blobListingDetails: Microsoft.WindowsAzure.Storage.Blob.BlobListingDetails.Metadata )
.OfType<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob>()
.Select<Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob, T>( blob => JsonConvert.DeserializeObject<T>( blob.Metadata[ "data" ] ) )
.Where( filter.Compile() );
}
此函数可以这样调用: 仓库repository = ..
IEnumerable files = repository.GetMany( f => f.Partner = "Microsoft" );
基类
文件类为:
public class ContractFile : File
{
public string Partner { get; set; }
public Date CreationDate { get; set; }
public string Remarks { get; set; }
public string Filename { get; set; }
}
...
public class File
{
public String File { get; set; }
public Stream Data { get; set; }
}
插入内容如下:
public void AddOne( T file )
{
file.id = Guid.NewGuid().ToString();
Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob blob = _AzureBlobCollection.BlobDirectory.GetBlockBlobReference( file.id );
blob.UploadFromStream( file.Data );
blob.Metadata.Add( "data", JsonConvert.SerializeObject( file ) );
blob.SetMetadata();
}