我观察到使用以下代码下载文件时:
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
HttpContext.Current.Response.WriteFile("~/test.pdf");
HttpContext.Current.ApplicationInstance.CompleteRequest();
我们得到的文件大于使用以下代码的文件:
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
HttpContext.Current.Response.WriteFile("~/test.pdf");
HttpContext.Current.Response.End();
较大的尺寸是因为在第一种情况下,在文件结束之后添加了从中下载文件的页面的源代码。因此,所有下载的文件都增加了固定的字节数,等于源代码的字节长度。对于PDF,当使用Adobe Reader打开它时,这些额外的字节被解释为更改,当关闭提示保存更改时,之后pdf恢复其较小的大小。如果文件与十六进制编辑器进行比较,则警告相同但大小不同,最后可以在EOF标记后看到页面源代码的字节。
如果不使用物理文件,而是使用MemoryStream并通过Response.BinaryWrite()发送字节数组,那么情况也是如此。
这种行为可能是什么原因以及如何纠正?
答案 0 :(得分:0)
我找到了解决方案。使用Response.SupressContent(),抑制EOF标记后添加的html,文件pdf与源相同:
HttpContext.Current.Response.ContentType = "application/pdf";
HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
HttpContext.Current.Response.WriteFile("~/test.pdf");
Response.Flush();
Response.SuppressContent = true;
HttpContext.Current.ApplicationInstance.CompleteRequest();
答案 1 :(得分:0)
为避免在使用HttpApplication.CompleteRequest()
时呈现页面,可以将Page.Visible
设置为false
。这比HttpResopnse.SuppressContent
更好,因为它实际上避免了首先呈现内容而不是执行内容。
我认为也建议避免使用Flush()
,因为这样可以防止异步刷新。
在编写此代码时,假定它位于System.Web.UI.Page
的子类中:
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=~/test.pdf");
Response.WriteFile("~/test.pdf");
Response.SuppressContent = true;
Visible = false;
Context.ApplicationInstance.CompleteRequest();