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