如何解决blob流的Length属性值始终为-1,无论文件是否为空
我有一个代码,用于打开存储中blob的流以读取其内容(如下所述),该blob是一个Json文件,有时为空,它出现在azure门户上,带有0B,可以下载并打开。
我检查blobStream.Length属性以了解它是否为空blob以便处理文件,无论出于何种原因,无论文件为空还是不是Length属性都是-1而不是0。
我在某些地方读到了-1是属性的初始化值,并且必须调用FetchAttributesAsync来更新元数据..并且我在Microsoft文档上读到,调用OpenReadAsync会自动调用FetchAttributesAsync,如这些文档带有备注:
不确定发生了什么,是否是FetchAttributes调用是问题还是打开流时出现问题,以及为什么Length始终为-1。
我使用Azure.Storage.Blobs创建带有连接字符串的blob客户端,并返回blob流以读取其内容
_blobServiceClient = new BlobServiceClient(connectionString);
blobStream = await _blobServiceClient.GetBlobContainerClient(container).GetBlobClient(blobName).OpenReadAsync(cancellationToken: cancellationToken);
从OpenReadAsync返回的流中,我们检查长度..并处理文件:
if( blobStream.Length == 0 ) continue;
解决方法
如果您想将blob文件作为流读取,则BlobBaseClient.DownloadTo
方法会有所帮助。
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
BlobContainerClient container = blobServiceClient.GetBlobContainerClient(containerName);
BlobClient blob = container.GetBlobClient(blobName);
MemoryStream s = new MemoryStream();
blob.DownloadTo(s);
Console.WriteLine(s.Length);
还有另一种使用BlobProperties.ContentLength
获取blob内容长度的方法。
BlobClient blob = container.GetBlobClient(blobName);
var properties = blob.GetProperties();
Console.WriteLine(properties.Value.ContentLength);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。