从http服务传输大文件

从http服务传输大文件

问题描述:

我正在编写一个组件来从HTTP服务传输大(4 + GB)。该组件采用URL和目标流。目标流可能是一个文件流,或者它可能是一个流向不同的HTTP服务或甚至两者。由于我的组件的作者,我需要做的这些步骤,直到我做:从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); 

这一个看起来很有希望,但很可惜,它试图利用单个写写()语句整个事情。

我怎样才能完成这项任务,而不会浪费我的记忆?我更喜欢使用flurl,但我并没有与它联系在一起。

+0

Flurl会让你访问底层的'NetworkStream'吗?如果没有,它不适用于这 –

做一些挖后,我发现下面的代码解决了我的问题:

var response = flurlClient.SendAsync(
    HttpMethod.Get, null, null, HttpCompletionOption.ResponseHeadersRead); 
var stream = response.Content.ReadAsStreamAsync(); 

在这种情况下,回来不再是一个内存流,但网络流流。

+0

是的,这就是你想要做的。 Flurl的[DownloadFileAsync](https://github.com/tmenier/Flurl/blob/master/src/Flurl.Http/DownloadExtensions.cs#L24)在内部就是这样。 –