2011-06-07 35 views
0

在我的项目中,用户可以将文件上传到1GB。我想将上传的文件流数据复制到第二个流。 如果我这样使用如何将一个Stream对象值复制到asp.net中的第二个Stream对象

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

那么它需要这么多时间。

如果我尝试通过字节数组来做到这一点,那么我需要在long中添加无效的数组大小。

如果有人有更好的想法做到这一点,那么请让我知道。

-

嗨凯布利感谢your response。我试过Stream.Copy,但它花费了很多时间将一个流对象复制到第二个。

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

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

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

如果我做错了什么,那么请让我知道。

+0

更新我的回应。 – Khepri 2011-06-07 15:41:40

回答

1

这是.NET 4.0吗?

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

如果没有,并在信用到期时给予信用,请参阅this SO thread.中的答案如果您不是.NET 4.0,请务必阅读该主题中的注释,因为有一些替代解决方案(Async stream reading/writing)可能是值得调查,如果表现是绝对的溢价可能是你的情况。

编辑:

基于断更新,你想将文件复制到另一个远程目标? (只是猜测基于GetRequestStream()[GetRequestStream()]。时间将是文件内容到目的地的实际传输。因此,在这种情况下,当您执行fs.CopyTo(strm)时,必须将这些字节从源数据流到远程服务器,这就是时间的来源,你真的在​​做一个大文件的上传文件,CopyTo会阻止你的处理,直到它完成为止

我建议看看这样的纺纱或者至少查看我列出的异步选项,但您无法真正避免这种情况需要很长一段时间,但您受到文件大小和可用上传带宽的限制。当在本地工作时 CopyTo是亚秒。我测试了一半gig文件,并且一个快速秒表类返回了800毫秒的处理时间。

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); 
     } 
    } 
相关问题