从 http 服务流式传输大文件

2024-03-23

我正在编写一个组件来从 HTTP 服务传输大数据(4+ GB)。该组件采用 URL 和目标流。目标流可以是文件流,也可以是 POSTS 到不同 HTTP 服务的流,甚至两者都是。作为组件的作者,我需要执行以下步骤直到完成:

  1. 从 HTTP 流中读取合理大小的缓冲区,
  2. 将此缓冲区写入目标流,
  3. 刷新目标流(输出到磁盘、网络等)

我永远不应该超过内存中数据缓冲区的大小。

我正在使用 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();

这种情况下,返回的流不再是内存流,而是网络流。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 http 服务流式传输大文件 的相关文章

随机推荐