【问题标题】:FtpWebRequest Upload out-of-memoryFtpWebRequest 上传内存不足
【发布时间】:2011-07-12 06:27:45
【问题描述】:

我在这里使用示例: http://msdn.microsoft.com/en-us/library/ms229715.aspx 将 1GB 的大文件上传到 FTP 服务器。然而它就在线窒息:

byte[] fileContents = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());

出现内存不足异常。有没有办法将文件从磁盘直接流式传输到 FTP 服务器,而无需一次将所有文件读入内存?我希望我可以将它分块并一点一点发送,但我原以为我可以将读取流指向写入流...

【问题讨论】:

    标签: ftpwebrequest


    【解决方案1】:

    您可以尝试简单地以块的形式写入请求流 - 如果您使用的是 .NET 4,Stream.CopyTo 将使这变得非常容易:

    using (Stream input = File.OpenRead(filename))
    {
        using (Stream output = request.GetRequestStream())
        {
            input.CopyTo(output);
        }
    }
    

    您可能想查看FtpWebRequest 的文档以了解是否有任何关于缓冲的内容 - 基本上您想禁用那里的任何缓冲。

    (顺便说一句,在没有using 语句的资源处理方面,这是 MSDN 中一个令人震惊的糟糕示例。Ick。)

    【讨论】:

      【解决方案2】:

      一般来说,你会写一个循环:

      1. sourceStream 中读取一个块(16 kB 是合理的)
      2. 将该块写入requestStream
      3. 如果不在输入末尾,则返回 1。

      【讨论】:

      • 感谢格雷格的建议。我没有尝试,因为 Jon 第一次工作,但它看起来是一个不错的选择。
      • 乔恩的建议和我说的一样,在CopyTo :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-13
      相关资源
      最近更新 更多