我有以下代码,在我的Web应用程序中返回一个PDF文件:
string path = "help.pdf"; byte[] data = File.ReadAllBytes(path); Response.Clear(); Response.ClearHeaders(); Response.AddHeader("Content-Length", data.Length.ToString()); Response.AddHeader("Content-Type", "application/pdf"); Response.AddHeader("Content-Disposition", "attachment; filename=help.pdf"); Response.OutputStream.Write(data, 0, data.Length); Response.End();
当我在任何浏览器(Chrome,IE或Firefox)中调用此代码的处理程序时,我会得到一个“另存为…”对话框,其中包含页面名称( index.aspx ),而不是代码中提供的名称help.pdf )。
我检查了所有浏览器的HTTP响应头。 它看起来像这样:
Cache-Control:private Content-Disposition:attachment Content-Length:89407 Content-Type:application/pdf Date:Thu, 07 May 2015 08:43:12 GMT Server:Microsoft-IIS/7.5 X-Powered-By:ASP.NET X-UA-Compatible:IE=edge,chrome=1
正如你所看到的,文件名参数已从Content-Disposition字段中删除。 所以浏览器的行为是正确的。 Web服务器(IIS)似乎与标题修补。
我在这里发现了一个同样的问题。 但问题从未解决。 有任何想法吗?
注意:修改代码不是一个解决scheme。 我们有网站上的第三方控件(Telerik RadGrid)与“导出到PDF”function有同样的问题。
问题在于,由于IIS 7.5问题,有人web.config添加到应用程序的web.config文件中:
<outboundRules> <rule name="Force pdfs to download" preCondition="only match pdfs"> <match serverVariable="RESPONSE_Content_Disposition" pattern="(.*)" /> <action type="Rewrite" value="attachment" /> </rule> <preConditions> <preCondition name="only match pdfs"> <add input="{RESPONSE_CONTENT_TYPE}" pattern="^application/pdf" /> </preCondition> </preConditions> </outboundRules>