如何解决将文件流式传输到 Azure Blob 存储?
考虑以下代码:
var container = new BlobContainerClient(...);
// fileStream is a stream delivering 10 MB of data
await container.UploadBlobAsync("name-of-blob",fileStream);
使用 Fiddler 代理观察 HTTP 请求,我可以看到这以 4 个 HTTP PUT 请求结束(地址是 127.0.0.1,因为我正在使用 Azurite 模拟器进行本地测试):
前两个请求(603 和 607)大小为 4 MB,第三个(613)大小为 2 MB,第四个(614)最终提交所有发送的块。
-
不是对数据发出 3 个请求(4 MB + 4 MB + 2 MB),是否可以在一个请求中流式传输 10 MB 的数据以节省一些开销?
-
由于数据以 4 MB 的块发送,这是否意味着 Azure 存储客户端会等到它从
fileStream
获得 4 MB 才开始发送,这意味着 4 MB 的 RAM 用于缓存?我使用fileStream
的目的是通过直接将 fileStream 传递到 Azure Blob 存储来减少内存使用量。
我使用的是 Azure.Storage.Blobs
版本 12.8.0(我写这篇文章时的最新稳定版本)。
解决方法
广告 1) PUT 操作中单个块的最大大小取决于 Azure 存储服务器版本(请参阅 here)。出于测试目的,我刚刚在 Azure 中创建了一个新的存储帐户,并使用 10.5 MB 的视频文件开始了 UploadBlobAsync()
操作,Fiddler 向我展示了这个
一个 10544014 字节的 PUT 操作。请注意 x-ms-version
请求标头,它使客户端能够指定要使用的版本(请参阅 here)。我想您的本地模拟器只是使用旧的 API 版本。
广告 2) 是的,对于较大的文件,UploadBlobAsync()
会将请求分块,从流中读取一组字节,执行 PUT,读取下一组字节,执行 PUT 等等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。