blob 流长度属性值始终为 -1,无论文件是不是为空
Posted
技术标签:
【中文标题】blob 流长度属性值始终为 -1,无论文件是不是为空【英文标题】:blob stream Length property value always -1, no matter the file empty or notblob 流长度属性值始终为 -1,无论文件是否为空 【发布时间】:2021-02-08 11:03:28 【问题描述】:我有一个代码可以打开存储上 blob 的流以读取其内容(步骤如下所述),该 blob 是一个有时为空的 Json 文件,它出现在 azure 门户上,带有 0B,并且可以下载和打开了。
我检查 blobStream.Length 属性以了解它是否为空 blob 用于处理文件,出于某种原因,无论文件是否为空,Length 属性为 -1 而不是 0。
我在某些地方读到 -1 是属性的初始化值,并且必须调用 FetchAttributesAsync 才能更新元数据。我在 Microsoft 文档中读到调用 OpenReadAsync 会自动调用 FetchAttributesAsync,在这些文档在备注下:
OpenReadAsyncDocs
FetchAttributesAsyncDocs
不确定发生了什么,问题是 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;
【问题讨论】:
您发布的代码真的是您实际使用的代码吗?因为我希望在某处看到await
。
我没有复制过去我写了我一般所做的,无论如何编辑了问题。
【参考方案1】:
如果您想将 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);
【讨论】:
这很有帮助,谢谢 :D,我采取了另一种方式来获取 blob 属性,然后如果内容为 0,则相应地打开读取流。我还向存储提出了一个问题,希望如果它是一个错误,得到处理。以上是关于blob 流长度属性值始终为 -1,无论文件是不是为空的主要内容,如果未能解决你的问题,请参考以下文章
java 怎么读取oracle的blob类型数据,我的是保存新闻内容! 只有这么多财富值了,帮个忙谢谢
Microsoft Azure 流分析和 Blob 存储输入