如何将一个Stream对象值复制到asp.net中的第二个Stream对象

时间:2011-06-07 05:54:04

标签: c# asp.net

在我的项目中,用户可以上传最大1GB的文件。我想将上传的文件流数据复制到第二个流。 如果我这样使用

int i;
while ( ( i = fuVideo.FileContent.ReadByte() ) != -1 )
{
  strm.WriteByte((byte)i);
}

然后花了这么多时间。

如果我尝试通过字节数组执行此操作,那么我需要在long中添加无效的数组大小。

如果有人有更好的想法,请告诉我。

-

嗨Khepri感谢your response。我试过Stream.Copy但是花了很多时间将一个流对象复制到第二个。

我尝试使用8.02Mb文件,花了3到4分钟。 我添加的代码是

Stream fs = fuVideo.FileContent;  //fileInf.OpenRead();

Stream strm = ftp.GetRequestStream();
fs.CopyTo(strm);

如果我做错了,请告诉我。

2 个答案:

答案 0 :(得分:1)

这是.NET 4.0吗?

如果是这样Stream.CopyTo可能是你最好的选择。

如果没有,并且在信用到期时给予信任,请参阅this SO thread.中的答案。如果您不是.NET 4.0,请确保阅读该线程中的注释,因为有一些替代解决方案({{ 3}})如果表现绝对溢价可能值得调查,可能是你的情况。

编辑:

根据更新,您是否尝试将文件复制到另一个远程目标? (只是基于GetRequestStream()[Async stream reading/writing]进行猜测。时间将是文件内容到目的地的实际传输。所以在这种情况下当你执行fs.CopyTo(strm)时它必须移动从源流到远程服务器的那些字节。这就是时间的来源。你真的在做一个巨大文件的文件上传.CopyTo将阻止你的处理,直到它完成。

我建议将这种处理转移到另一个任务或者至少查看我列出的异步选项。你不能真正避免这种情况需要很长一段时间。您受文件大小和可用上载带宽的限制。

我验证了当本地时,CopyTo是亚秒级的。我用半个gig文件进行测试,快速秒表类的返回处理时间为800毫秒。

答案 1 :(得分:0)

如果您不是.NET 4.0,请使用此

    static void CopyTo(Stream fromStream, Stream destination, int bufferSize)
    {
      int num;
      byte[] buffer = new byte[bufferSize];
      while ((num = fromStream.Read(buffer, 0, buffer.Length)) != 0)
      {
         destination.Write(buffer, 0, num);
      }
   }