C#Response.WriteFile与Response.TransmitFile文件大小问题
我在服务器上有一个5Mb的pdf文件,使用writeFile加载这个文件会给我一个15Mb的下载,其中transmitfile提供了正确的5Mb文件大小 这是由于服务器上对writeFile的内存进行了某种解压缩所致吗?只是想知道是否有人见过同样的事情发生 (ps只在我们去iis7后才注意到它??) 代码是C#Response.WriteFile与Response.TransmitFile文件大小问题,c#,transmitfile,C#,Transmitfile,我在服务器上有一个5Mb的pdf文件,使用writeFile加载这个文件会给我一个15Mb的下载,其中transmitfile提供了正确的5Mb文件大小 这是由于服务器上对writeFile的内存进行了某种解压缩所致吗?只是想知道是否有人见过同样的事情发生 (ps只在我们去iis7后才注意到它??) 代码是 if (File.Exists(filepath)) { HttpContext.Current.Response.Clear(); HttpContext.Current.
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();
}
TransmitFile—将指定的文件直接写入HTTP响应输出流,而不在内存中进行缓冲 WriteFile—将指定的文件直接写入HTTP响应输出流
我想说,之所以会出现这种差异,是因为传输文件没有缓冲它。写入文件使用缓冲(Afiak),基本上是在传输数据之前暂时保存数据,因此它无法猜测准确的文件大小,因为它是以块的形式写入的 您可以通过以下定义来理解 Response.TransmitFile与Response.WriteFile:
- TransmitFile:此方法将文件发送到客户端,而不将其加载到服务器上的应用程序内存中。如果下载的文件很大,这是使用它的理想方式
- WriteFile:此方法在将要下载的文件发送到客户端之前,将其加载到服务器内存中。如果文件大小较大,则可能会重新启动ASPNET工作进程*
参考资料:-我刚刚遇到了同样的错误。IIS上的压缩设置不会影响它。