我对输出PDF文件有疑问。目前我正在以二进制形式将PDF存储在数据库中。我正在通过以下URL输出PDF文件:
http://myhost.com/FileManager.aspx?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278
所以从我可以推断,到浏览器这是一个加载而不是PDF的.aspx页面。 Firefox和IE正确地解释了这一点并启动了Adobe Acrobat,但是由于Chrome(12.0.742.112)有自己的PDF阅读器实现,它会正确打开文件,但是当有人去用chrome保存文件时,它想要将其保存为.aspx。如果我只是将.aspx重命名为.pdf,则文件会正确下载。但是,我试图避免告诉我的客户他/她可能不得不采取额外措施。
当我选择通过Web Inspector查看Chrome中加载的标题时,我看到了这一点:
FileManager.aspx:-1资源被解释为文档但已传输 MIME类型application / pdf
我完全可以理解为什么Chrome会说这个。
此外,当我添加:
时,我会在页面加载时收到保存为框Response.AddHeader("content-disposition", "attachment;filename=blah.pdf");
但是,我希望将文件保存在浏览器中。除了使用一些URL Rewrite之外,有没有办法可以操作HTTP Headers来简单地以PDF格式打开页面并在Chrome中正确保存?
最后,我尝试使用WebService,但我似乎无法将二进制数据写入页面。
this.Context.Response.BinaryWrite(bytes);
感谢任何帮助!
答案 0 :(得分:4)
在Web应用程序的顶级web.config中,将以下<add>
元素添加到<httpHandlers>
部分:
<httpHandlers>
<add verb="*" path="FileManager.pdf" type="ProjectName.FileManager" />
...其中ProjectName.FileManager
是FileManager
中FileManager.aspx.cs
类的全名(名称空间和类名)。
这告诉ASP.NET使用/FileManager.pdf
定义的处理程序处理路径ProjectName.FileManager
。 (System.Web.UI.Page
实现了IHttpHandler
接口,因此每个webform都是一个处理程序。)
现在,您可以通过带有 .pdf 扩展名的网址投放PDF,如下所示:
http://myhost.com/FileManager.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278
您不需要重命名物理FileManager.aspx
文件。当用户在浏览器中输入/FileManager.pdf?FileId=foo时,ASP.NET将使用FileManager中定义的ProjectName.FileManager类处理请求。 aspx 。< / p>
注意:强>
以上内容适用于 Cassini (Visual Studio“迷你”网络服务器),无需进一步更改。但是, IIS 默认情况下只向ASP.NET发送* .aspx,* .asmx,* .ashx请求。因此,为了使上述工作在IIS上,您需要告诉它将/FileManager.pdf
的请求发送到ASP.NET。也就是说,您需要配置“映射”。
使用IIS 6,您需要configure the mapping using IIS manager。
使用IIS 7,您可以configure a mapping from your web.config - 这使部署更容易,但这取决于您的托管设置方式。
答案 1 :(得分:2)
对我有用的是在应用程序页面名称(在您的情况下为FileManager.aspx
)和查询标记(?
标记)之间添加预期的文件名。
所以,最后,你会有这样的事情:
http://myhost.com/FileManager.aspx/myfile.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278
令人惊讶的是,正确的应用程序将运行(Filemanager.aspx
),变量将无损地传递(FileId
),结果将被视为inline
(如果您没有更改)它是attachment
,但是浏览器会认为在用户想要保存页面时使用的文件名为myfile.pdf
。