我使用 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());
}
使用ListBlobs()方法,我看到了所有的blobs。每一个blob项都有一个URI,但我不能看到我需要的blob名称,而GetBlobReferenceFromServer()。
原因是 ListBlobs
方法返回一个类型为 IListBlobItem
其中没有name属性。为了获得blob的名称,你可以将它投向任何一个 CloudBlob
或 CloudBlockBlob
实现这个接口,你将能够得到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());
}