如何在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);

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

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

这是.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);
      }
   }