更好的下载二进制文件的方法?

时间:2009-10-02 23:55:15

标签: .net binary download

我有一个用户可以下载文件的网站。有些文件非常大(最大的是323 MB)。当我测试它以尝试下载此文件时,我得到内存不足异常。我知道下载文件的唯一方法如下。我使用下面的代码的原因是因为URL是编码的,我不能让用户直接链接到该文件。有没有其他方法可以下载此文件而无需将整个内容读入字节数组?

  FileStream fs = new FileStream(context.Server.MapPath(url), FileMode.Open,
                                                           FileAccess.Read);
  BinaryReader br = new BinaryReader(fs);
  long numBytes = new FileInfo(context.Server.MapPath(url)).Length;
  byte[] bytes = br.ReadBytes((int) numBytes);

  string filename = Path.GetFileName(url);
  context.Response.Buffer = true;
  context.Response.Charset = "";

  context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
  context.Response.ContentType = "application/x-rar-compressed";
  context.Response.AddHeader("content-disposition", "attachment;filename=" + filename);

  context.Response.BinaryWrite(bytes);
  context.Response.Flush();
  context.Response.End();

2 个答案:

答案 0 :(得分:16)

而不是

context.Response.BinaryWrite(bytes);

使用

context.Response.TransmitFile(context.Server.MapPath(url));

这样可以避免将整个文件读入内存。

答案 1 :(得分:3)

尝试这样的事情:

 using (var br = new BinaryReader(fs))
       {

            FileStream toFile = File.OpenWrite(ToFileName);
            byte[] buff = new byte[2000];
            while (reader.Read(buff, 0, 2000) > 0)
            {
                toFile.Write(buff, 0, 2000);
                toFile.Flush();
            }
       }

重要的是你使用较小的缓冲区并刷新写入流以清除内存。

现在,您正在BinaryReader和BinaryWriter中保存正在下载的整个文件。将下载分块到较小的缓冲区可以减轻内存负担。