FtpWebRequest上传内存不足

时间:2011-07-12 06:27:46

标签: ftpwebrequest

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

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

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

2 个答案:

答案 0 :(得分:5)

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

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

您可能需要查看FtpWebRequest的文档,看看是否有关于缓冲的内容 - 基本上您要禁用任何缓冲。

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

答案 1 :(得分:3)

一般来说,你要做的是写一个循环:

  1. sourceStream读取一个块(16 kB是合理的)
  2. 将该块写入requestStream
  3. 如果不在输入的最后,请返回1.