如何添加和获取Azure Blob的其他信息

时间:2018-11-19 07:18:18

标签: c# .net azure blob azure-storage

是否可以在Azure中为blob添加其他信息?

我想存储一些相关信息,这些信息将blob连接到文档数据库中的其他实体,例如,包含JSON的字符串。

我知道使用Azure存储资源管理器时会有blob的元数据,但是我想从代码中使用它。

这是与此主题相关的问题: Adding Description/Metadata to Azure Blob

又如何基于此元数据检索blob?

2 个答案:

答案 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();
    }