PDF中的PDF二进制数据输出

时间:2011-07-13 00:35:34

标签: c# .net asp.net web-services pdf

我对输出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);

感谢任何帮助!

2 个答案:

答案 0 :(得分:4)

在Web应用程序的顶级web.config中,将以下<add>元素添加到<httpHandlers>部分:

<httpHandlers>
    <add verb="*" path="FileManager.pdf" type="ProjectName.FileManager" />

...其中ProjectName.FileManagerFileManagerFileManager.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