将文件流式传输到 Azure Blob 存储?

时间:2021-02-20 12:45:10

标签: c# azure http stream azure-storage-blobs

考虑以下代码:

 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 模拟器进行本地测试): enter image description here

前两个请求(603 和 607)大小为 4 MB,第三个(613)大小为 2 MB,第四个(614)最终提交所有发送的块。

  1. 不是对数据发出 3 个请求(4 MB + 4 MB + 2 MB),是否可以在一个请求中流式传输 10 MB 的数据以节省一些开销?

  2. 由于数据以 4 MB 的块发送,这是否意味着 Azure 存储客户端会等到它从 fileStream 获得 4 MB 才开始发送,这意味着 4 MB 的 RAM 用于缓存?我使用 fileStream 的目的是通过直接将 fileStream 传递到 Azure Blob 存储来减少内存使用量。

我使用的是 Azure.Storage.Blobs 版本 12.8.0(我写这篇文章时的最新稳定版本)。

1 个答案:

答案 0 :(得分:2)

广告 1) PUT 操作中单个块的最大大小取决于 Azure 存储服务器版本(请参阅 here)。出于测试目的,我刚刚在 Azure 中创建了一个新的存储帐户,并使用 10.5 MB 的视频文件开始了 UploadBlobAsync() 操作,Fiddler 向我展示了这个

enter image description here

一个 10544014 字节的 PUT 操作。请注意 x-ms-version 请求标头,它使客户端能够指定要使用的版本(请参阅 here)。我想您的本地模拟器只是使用旧的 API 版本。

广告 2) 是的,对于较大的文件,UploadBlobAsync() 会将请求分块,从流中读取一组字节,执行 PUT,读取下一组字节,执行 PUT 等等。

>