如何从 ASP.NET 中的 Web 请求返回 pdf?

Posted

技术标签:

【中文标题】如何从 ASP.NET 中的 Web 请求返回 pdf?【英文标题】:How can I return a pdf from a web request in ASP.NET? 【发布时间】:2011-01-04 16:42:51 【问题描述】:

简单地说,我希望有人能够点击一个链接,并获得一次性使用的 pdf。我们有创建 PDF 文件的库,所以这不是问题。

我们可以生成一个指向 aspx 页面的链接,让该页面生成 pdf,将 pdf 保存到文件系统,然后 Response.Redirect 到保存的 pdf。然后我们必须以某种方式跟踪和清理 PDF 文件。

由于我们不需要保留这些数据,如果可能的话,我想做的是让 aspx 页面生成 pdf,并将其作为对原始请求的响应直接返回。这可能吗?

(在我们的例子中,我们使用的是 C#,我们希望返回一个 pdf,但似乎任何解决方案都可能适用于各种 .NET 语言和返回的文件类型。)

【问题讨论】:

相关:***.com/questions/1038707/… 在任何意义上都没有被上述内容所欺骗。 (我知道我会让一些人说要关闭为骗子,指向那种类型的问题......这就是为什么我包括第二句话。我应该把它放在第一句话句子。:) ) 【参考方案1】:

假设您可以获得代表您的 PDF 的 byte[]

Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Disposition",
    "attachment;filename=\"FileName.pdf\"");

Response.BinaryWrite(yourPdfAsByteArray);

Response.Flush();

Response.End();

【讨论】:

这看起来很有希望......我认为这将是一些类似的东西,但没有了解细节的背景。感谢您的回复;我会试试这个技巧。 这正好解决了问题。谢谢! 一个相关问题(也许我应该打开一个单独的问题,但它与这个答案密切相关......)为什么使用 Response.Flush()?当我们有那行,并且有人在发出请求后关闭浏览器时,我们得到一个错误:“远程主机关闭了连接。”如果我们忽略该行,则没有错误,并且一切似乎都可以正常工作。阅读 MSDN 文档并没有让我明白这是否是绝对必要的。想法? 快速浏览一下 Reflector 说 Response.End() 无论如何都会调用 Response.Flush() ......所以也许它不是明确需要的。【参考方案2】:

看看 HTTP 是如何工作的。客户端(=浏览器)不依赖扩展,它只希望服务器与文档一起返回一些元数据。

可以使用 Response.AddHeader 添加元数据,一个“元数据行”由名称和值组成。

Content-Type 是您感兴趣的属性,值为数据的 MIME 类型(研究:RFC1945 for HTTP headers,google for MIME type)。

对于有序的 aspx 页面(html,....),属性是 'text/html'(不是那么简单,但对于这个例子来说就足够了。)。如果你返回JPG图片,它可以有名字'image.gif',但只要你在Content-Type中发送'image/jpeg',它就会被处理为JPG图片。 pdf 的内容类型是“应用程序/pdf”。

浏览器将按照默认行为进行操作,例如,使用 Adob​​e 插件,它会在其窗口中显示 PDF,如果您没有任何 PDF 插件,它应该下载文件等。

Content-Disposition 标头说明了您应该如何处理数据。如果您希望客户端明确地“下载”一些 HTML/PDF/其他内容,并且默认情况下不显示它,那么值“附件”就是您想要的。它应该有另一个参数(如 Justin Niessner 所建议),用于以下情况:

http://server/download.aspx?file=11 -> Content-Disposition: attachment;filename=file.jpg 表示,默认情况下文件应如何命名。

【讨论】:

以上是关于如何从 ASP.NET 中的 Web 请求返回 pdf?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 ASP.NET 网站(不是 Web 应用程序)中的用户控件获取父页面

如何从 ASP.net 5 web api 返回文件

试图从asp.net web api self host中的请求中获取用户代理

如何从 ASP.NET Core Web API 中的 SQL Server 存储过程中获取返回值

下载文件请求返回 JSON 而不是服务器上 ASP.NET Web API 中的文件

如何在Asp .Net Web API中的请求的整个生命周期中使类对象可用?