我一直在尝试一些方法,并得到这个。
我真正需要的是像 Response.TransmitFile (或 MVC File 方法,它在它后面使用 TransmitFile)。但是使用 FileShare.ReadWrite 而不是 Read。
我正在测试一个 2GB 的文件。TransmitFile 没有内存或 CPU 占用空间。
我试图做类似的事情,但我不知道我是否走在正确的道路上。这种方法不消耗内存,但是峰值消耗7%的cpu
private void Download(string caminho)
{
const int tamanhoBuffer = 8192;
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename*=UTF-8''" + Path.GetFileName(caminho) + "");
using (var fs = new FileStream(caminho, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
Response.AddHeader("Content-Length", fs.Length.ToString());
byte[] conteudo = new byte[tamanhoBuffer];
int size;
while (Response.IsClientConnected && (size = fs.Read(conteudo, 0, conteudo.Length)) > 0)
{
Response.OutputStream.Write(conteudo, 0, size);
Response.Flush();
}
Response.End();
}
}