PDF二进制数据输出在.net

本文关键字:net 输出 数据 二进制 PDF | 更新日期: 2023-09-27 18:02:07

我有一个关于输出PDF文件的问题。目前,我以二进制形式将PDF存储在数据库中。我通过URL输出PDF文件,例如:

http://myhost.com/FileManager.aspx?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

所以根据我的推断,对于浏览器来说,这是一个正在加载的.aspx页面,而不是PDF。Firefox和IE正确地解释了这一点,并启动了Adobe Acrobat,但是由于Chrome(12.0.742.112)有自己的PDF阅读器实现,它可以正确打开文件,但是当有人在Chrome中保存文件时,它想要将其保存为。aspx。如果我只是将.aspx重命名为.pdf,文件就可以正确下载。但是,我尽量避免告诉我的客户,他/她可能需要采取额外的步骤。

当我选择查看通过Web Inspector加载在Chrome中的标头时,我看到了这个:

文件管理。aspx:-1资源被解释为文档,但被传输MIME类型application/pdf

我完全可以理解为什么Chrome会这样说。

此外,当我添加:

时,我在页面加载时得到一个save as框:
Response.AddHeader("content-disposition", "attachment;filename=blah.pdf");

然而,我希望只是将文件保存在浏览器中。所以除了使用一些URL重写,有没有一种方法,我可以操纵HTTP头简单地打开页面作为PDF和保存在Chrome正确?

最后,我尝试使用WebService,但我似乎无法将二进制数据写入页面。

this.Context.Response.BinaryWrite(bytes);

任何帮助都是感激的!

PDF二进制数据输出在.net

在web应用程序的顶层web。配置,将以下<add>元素添加到<httpHandlers>部分:

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

…其中,ProjectName.FileManagerFileManager.aspx.csFileManager类的全称(命名空间和类名)。

这告诉ASP。使用ProjectName.FileManager定义的处理程序来处理路径/FileManager.pdf。(System.Web.UI.Page实现了IHttpHandler接口,所以每个webform都是一个处理程序。)

现在您可以通过URL提供pdf,扩展名为.pdf,如下所示:

http://myhost.com/FileManager.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

您不需要重命名物理FileManager.aspx文件。当用户输入/FileManager.pdf?浏览器中的FileId=foo, ASP。. NET将使用ProjectName处理请求。FileManager.aspx.

注意:

以上应该在Cassini (Visual Studio"迷你"web服务器)上工作,无需进一步更改。但是IIS默认情况下只发送*。aspx, *。asmx, *。请求到ASP.NET。因此,要在IIS上工作,您需要告诉它将/FileManager.pdf的请求发送到ASP.NET。也就是说,您需要配置一个"映射"。

对于IIS 6,您需要使用IIS管理器配置映射。

使用IIS 7,您可以从web配置映射。配置——这使部署更容易,但这取决于您的主机是如何设置的。

对我来说有效的是在应用程序页面名称(在您的情况下,FileManager.aspx)和查询标记(?标记)之间添加预期的文件名。

所以,最后,你会得到这样的东西:

http://myhost.com/FileManager.aspx/myfile.pdf?FileId=8465b2f9-b64e-4a9a-a449-94b5adb3b278

令人惊讶的是,正确的应用程序将运行(Filemanager.aspx),变量将毫发无损地传递(FileId),结果将被视为inline(如果您没有将其更改为attachment,也就是说),但浏览器会认为要使用的文件名,以防用户想要保存页面,是myfile.pdf