在 Azure 存储上读取 blob 内容

问题描述 投票:0回答:1

我使用 Microsoft.Azure.Storage.Blob nuget 包试图获取容器中的 blobs 列表,然后读取内容。

通过ListBlobs()方法,我看到了所有的blob。每个blob项都有一个URI,但我看不到我需要的blob名称,我需要GetBlobReferenceFromServer()。

因此,在下面的示例代码中,blob名称是一个常量。

正确的方法是什么?我是否必须拆分和解析URI来找到blob名称? 我是否必须使用其他方法?

Microsoft.Azure.Storage.Blob.CloudBlobContainer container = 
    new Microsoft.Azure.Storage.Blob.CloudBlobContainer(new Uri("https://myaccount.blob.core.windows.net/containername"), 
                                                        new Microsoft.Azure.Storage.Auth.StorageCredentials("myaccount", "**********=="));

IEnumerable<Microsoft.Azure.Storage.Blob.IListBlobItem> blobs = container.ListBlobs();

foreach (var blobItem in blobs)
{
    //string blobUri = blobItem.Uri.ToString();

    Microsoft.Azure.Storage.Blob.ICloudBlob blockBlob = container.GetBlobReferenceFromServer("blobname");
    MemoryStream downloadStream = new MemoryStream();
    blockBlob.DownloadToStream(downloadStream);

    string blobContent = Encoding.UTF8.GetString(downloadStream.ToArray());
}
azure azure-storage-blobs
1个回答
1
投票

使用ListBlobs()方法,我看到了所有的blobs。每一个blob项都有一个URI,但我不能看到我需要的blob名称,而GetBlobReferenceFromServer()。

原因是 ListBlobs 方法返回一个类型为 IListBlobItem 其中没有name属性。为了获得blob的名称,你可以将它投向任何一个 CloudBlobCloudBlockBlob 实现这个接口,你将能够得到blob的名称,你可以使用 GetBlobReferenceFromServer 方法。

另外,一旦你列出了blob,你就不需要再调用 GetBlobReferenceFromServer 方法,因为作为列表的一部分,你已经拥有了关于blob的所有信息。而GetBlobReferenceFromServer则向存储发出另一个请求,以获取与listing中已有的相同的属性集。

所以,你的代码可以简单地。

foreach (var blobItem in blobs)
{
    var blockBlob = (CloudBlockBlob) blobItem;
    MemoryStream downloadStream = new MemoryStream();
    blockBlob.DownloadToStream(downloadStream);

    string blobContent = Encoding.UTF8.GetString(downloadStream.ToArray());
}

或者,如果你不走投胎路线,你可以简单地创建一个实例。CloudBlockBlob 使用你得到的URI作为列表的一部分。

比如说:

foreach (var blobItem in blobs)
{
    var blockBlob = new CloudBlockBlob(blobItem.Uri, container.ServiceClient);
    MemoryStream downloadStream = new MemoryStream();
    blockBlob.DownloadToStream(downloadStream);

    string blobContent = Encoding.UTF8.GetString(downloadStream.ToArray());
}
© www.soinside.com 2019 - 2024. All rights reserved.