8

我在服务器上有一个 5Mb 的 pdf 文件,使用 writeFile 下载这个文件给了我 15Mb 的下载量,而传输文件给出了正确的 5Mb 文件大小......

这是由于 writeFile 对服务器上的内存进行了某种解压缩吗?只是想知道有没有人看到同样的事情发生......

(ps直到我们去iis7才注意到它??)

代码正在...

if (File.Exists(filepath))
{
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("content-disposition","attachment;filename=\""+Path.GetFileName(filepath)+"\"");
    HttpContext.Current.Response.AddHeader("content-length", new FileInfo(filepath).Length.ToString());

    //HttpContext.Current.Response.WriteFile(filepath);
    HttpContext.Current.Response.TransmitFile(filepath);

    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();
}
4

2 回答 2

7

TransmitFile - 将指定文件直接写入 HTTP 响应输出流,而不将其缓冲在内存中。

WriteFile - 将指定文件直接写入 HTTP 响应输出流。

我会说发生差异是因为传输文件没有缓冲它。写入文件正在使用缓冲(Afiak),基本上在传输之前暂时保存数据,因此它无法猜测准确的文件大小,因为它是以块的形式写入的。

于 2010-01-21T16:28:01.863 回答
3

您可以通过以下定义来理解。

Response.TransmitFile VS Response.WriteFile:

  • TransmitFile:此方法将文件发送到客户端,而不会将其加载到服务器上的应用程序内存中。如果要下载的文件很大,这是使用它的理想方式。

  • WriteFile:此方法将正在下载的文件加载到服务器的内存中,然后再发送到客户端。如果文件很大,您可能会重新启动 ASPNET 工作进程。*

参考:- TransmitFile VS WriteFile

于 2015-05-19T13:26:51.450 回答