C# 如何在asp.net中将一个流对象值复制到第二个流对象
在我的项目中,用户可以上传高达1GB的文件。我想将上传的文件流数据复制到第二个流。 如果我像这样使用C# 如何在asp.net中将一个流对象值复制到第二个流对象,c#,asp.net,C#,Asp.net,在我的项目中,用户可以上传高达1GB的文件。我想将上传的文件流数据复制到第二个流。 如果我像这样使用 int i; while ( ( i = fuVideo.FileContent.ReadByte() ) != -1 ) { strm.WriteByte((byte)i); } 那就要花很多时间 如果我试图通过字节数组来实现这一点,那么我需要在long中添加数组大小,这是无效的 如果有人有更好的想法,那么请让我知道 -- 嗨,凯普里,谢谢你。我尝试了Stream.Copy,但是将一个S
int i;
while ( ( i = fuVideo.FileContent.ReadByte() ) != -1 )
{
strm.WriteByte((byte)i);
}
那就要花很多时间
如果我试图通过字节数组来实现这一点,那么我需要在long中添加数组大小,这是无效的
如果有人有更好的想法,那么请让我知道
--
嗨,凯普里,谢谢你。我尝试了Stream.Copy
,但是将一个Stream对象复制到第二个要花费很多时间
我尝试使用8.02Mb的文件,花了3到4分钟。
我添加的代码是
Stream fs = fuVideo.FileContent; //fileInf.OpenRead();
Stream strm = ftp.GetRequestStream();
fs.CopyTo(strm);
如果我做错了什么,请告诉我。这是.NET 4.0吗
如果是这样,那可能是你最好的选择
如果没有,并且要在值得表扬的地方给予表扬,请参阅“如果您不是.NET 4.0”中的答案。请确保阅读该线程中的注释,因为如果性能处于绝对溢价(这可能是您的情况),则有一些替代解决方案()可能值得研究
编辑:
根据更新,是否尝试将文件复制到其他远程目标?(基于GetRequestStream()[]进行猜测。时间将是文件内容实际传输到目标的时间。因此在本例中,当您执行fs.CopyTo(strm)时)它必须将这些字节从源流移动到远程服务器。这就是时间的来源。你实际上是在上传一个大文件。CopyTo将阻止你的处理,直到它完成为止
我建议您考虑将此类处理转移到另一个任务,或者至少考虑一下我列出的异步选项。您无法真正避免这需要花费大量时间。您受到文件大小和可用上载带宽的限制
我验证了在本地工作时,CopyTo的处理时间为亚秒。我使用半个gig文件进行了测试,一个快速秒表类返回的处理时间为800毫秒。如果您不是.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);
}
}