考虑以下代码:
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)最终提交所有已发送的 block 。
是否可以在一个请求中传输 10 MB 数据以节省一些开销,而不是对数据发出 3 个请求 (4 MB + 4 MB + 2 MB)?
由于数据以 4 MB block 的形式发送,这是否意味着 Azure 存储客户端会等到从
fileStream
获取 4 MB 数据后才开始发送,这意味着需要 4 MB RAM用于缓存?我使用fileStream
的目的是通过直接将 fileStream 传递到 Azure Blob 存储来减少内存使用量。
我正在使用 Azure.Storage.Blobs
版本 12.8.0(我撰写本文时的最新稳定版本)。
最佳答案
广告 1) PUT 操作中单个 block 的最大大小取决于 Azure 存储服务器版本(请参阅 here )。出于测试目的,我刚刚在 Azure 中创建了一个新的存储帐户,并使用 10.5 MB 视频文件启动了 UploadBlobAsync()
操作,Fiddler 向我展示了这一点
单个 PUT 操作占用 10544014 字节。请注意 x-ms-version
请求 header ,它使客户端能够指定要使用的版本(请参阅 here )。我想您的本地模拟器只是使用较旧的 API 版本。
Ad 2) 是的,对于较大的文件 UploadBlobAsync()
将对请求进行分块,从流中读取一组字节,执行 PUT,读取下一组字节,执行 PUT 并等等。
关于c# - 将文件流式传输到 Azure Blob 存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66291669/