从http服务传输大文件
问题描述:
我正在编写一个组件来从HTTP服务传输大(4 + GB)。该组件采用URL和目标流。目标流可能是一个文件流,或者它可能是一个流向不同的HTTP服务或甚至两者。由于我的组件的作者,我需要做的这些步骤,直到我做:从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);
这一个看起来很有希望,但很可惜,它试图利用单个写写()语句整个事情。
我怎样才能完成这项任务,而不会浪费我的记忆?我更喜欢使用flurl,但我并没有与它联系在一起。
答
做一些挖后,我发现下面的代码解决了我的问题:
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)在内部就是这样。 –
Flurl会让你访问底层的'NetworkStream'吗?如果没有,它不适用于这 –