我有一个用户可以下载文件的网站。有些文件非常大(最大的是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();
答案 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中保存正在下载的整个文件。将下载分块到较小的缓冲区可以减轻内存负担。