从http服务流式传输大文件

时间:2017-10-21 01:15:04

标签: c# .net http stream flurl

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

  1. 从HTTP流中读取合理大小的缓冲区
  2. 将此缓冲区写入目标流
  3. 刷新目标流(输出到磁盘,网络等)
  4. 我永远不会超过内存中数据缓冲区的大小。

    我正在使用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,但我并不喜欢它。

1 个答案:

答案 0 :(得分:1)

在做了一些挖掘之后,我发现以下代码解决了我的问题:

  def run(args) do
    options = parse_args(args)
    copying = parse_copying(options)
    db = ensure_database_module(options[:database])

    if options[:schema] do
      Amnesia.Schema.create
    end

    Amnesia.start
    try do
      db.create!(copying)
      :ok = db.wait(15000)
    after
      Amnesia.stop
    end
  end

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