从 http 服务流式传输大文件
Stream a large file from http service
我正在编写一个组件来从 HTTP 服务流式传输大型 (4+ GB) 数据。该组件采用 URL 和目标流。目标流可以是文件流,也可以是 POST 到不同 HTTP 服务的流,或者两者兼而有之。作为我的组件的作者,我需要执行这些步骤直到完成:
- 从 HTTP 流中读取合理大小的缓冲区,
- 将此缓冲区写入目标流,
- 刷新目标流(输出到磁盘、网络等)
我永远不应该超过内存中数据缓冲区的大小。
我正在使用 flurl 对服务器进行 HTTP 调用。我尝试了以下方式来拨打电话
var stream = await flurlClient.GetStreamAsync();
这给了我一个 MemoryStream,它不起作用,因为它会填满并占用与文件大小一样多的内存。
var response = flurlClient.GetAsync();
var stream = response.Content.ReadAsStreamAsync();
同样,内存流。
var response = flurlClient.GetAsync();
var stream = new CustomFlushingSteam();
response.Content.CopyToAsync(stream);
这个看起来很有希望,但是,唉,它试图用一个 Write() 语句来写整个东西。
如何在不炸毁记忆的情况下完成这项任务?我更喜欢使用 flurl,但我并不依赖它。
经过一番挖掘,我发现下面的代码解决了我的问题:
var response = flurlClient.SendAsync(
HttpMethod.Get, null, null, HttpCompletionOption.ResponseHeadersRead);
var stream = response.Content.ReadAsStreamAsync();
在这种情况下,返回的流不再是内存流而是网络流。
我正在编写一个组件来从 HTTP 服务流式传输大型 (4+ GB) 数据。该组件采用 URL 和目标流。目标流可以是文件流,也可以是 POST 到不同 HTTP 服务的流,或者两者兼而有之。作为我的组件的作者,我需要执行这些步骤直到完成:
- 从 HTTP 流中读取合理大小的缓冲区,
- 将此缓冲区写入目标流,
- 刷新目标流(输出到磁盘、网络等)
我永远不应该超过内存中数据缓冲区的大小。
我正在使用 flurl 对服务器进行 HTTP 调用。我尝试了以下方式来拨打电话
var stream = await flurlClient.GetStreamAsync();
这给了我一个 MemoryStream,它不起作用,因为它会填满并占用与文件大小一样多的内存。
var response = flurlClient.GetAsync();
var stream = response.Content.ReadAsStreamAsync();
同样,内存流。
var response = flurlClient.GetAsync();
var stream = new CustomFlushingSteam();
response.Content.CopyToAsync(stream);
这个看起来很有希望,但是,唉,它试图用一个 Write() 语句来写整个东西。
如何在不炸毁记忆的情况下完成这项任务?我更喜欢使用 flurl,但我并不依赖它。
经过一番挖掘,我发现下面的代码解决了我的问题:
var response = flurlClient.SendAsync(
HttpMethod.Get, null, null, HttpCompletionOption.ResponseHeadersRead);
var stream = response.Content.ReadAsStreamAsync();
在这种情况下,返回的流不再是内存流而是网络流。