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 存储输入

是否应该始终默认缺少枚举的 XML 属性?

始终在桌面最顶层显示的窗体

是否始终需要对(Azure Blob 存储)存档层进行再水化?

导航到 url 时始终下载 Azure Blob