【问题标题】:Download PDF in ASP MVC在 ASP MVC 中下载 PDF
【发布时间】:2013-06-03 06:17:39
【问题描述】:

我正在尝试使用 C# 在 ASP MVC 中下载 pdf 文件。

我有一个 UI 对话框,其中有一个按钮调用控制器:

 "Download PDF": function () {
            $.post(Urls.Action.DownloadPDF);

在控制器中,我使用 PDF 转换器将 html 转换为 PDF:

public ActionResult DownloadPDF()
     {
         string htmlToConvert = RenderViewAsString("~/Content/Eula.htm");
         HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
         byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory(htmlToConvert,null);
         HttpContext.Response.AddHeader("content-disposition", "attachment; filename=Download.pdf");
         FileResult fileResult = new FileContentResult(pdfBuffer, "application/pdf");
         fileResult.FileDownloadName = "Download.pdf";

         return fileResult;
     }

代码在调试器中运行该方法没有问题,并且帖子返回成功,但浏览器未下载 PDF。

编辑 -

核心价值 响应 HTTP/1.1 200 OK Cache-Control private, s-maxage=0,private,no-store,no-cache,s-maxage=0,max-age=0,must-revalidate,proxy-revalidate,no-transform 杂注无缓存 内容类型应用程序/pdf 过期 -1 服务器 Microsoft-IIS/7.5 设置Cookie 脸书;路径=/; HttpOnly X-AspNetMvc-版本 3.0 内容处置附件;文件名=下载.pdf 内容处置附件;文件名=下载.pdf X-AspNet-版本 4.0.30319 X-Powered-由 ASP.NET X-Content-Type-Options nosniff X-XSS-保护1;模式=块 X-UA 兼容 IE=edge,chrome=1 日期 2013 年 6 月 7 日星期五 03:31:34 GMT 内容长度 81862

【问题讨论】:

  • “浏览器没有下载 PDF”不是一个非常具有描述性的诊断。您的浏览器的 F12 工具对发送的网络活动和标头有何说明?您希望浏览器保存文件(使用content-disposition)还是在窗口中查看?
  • 我之前添加了内容配置...请查看带有响应标题的编辑。

标签: asp.net-mvc pdf


【解决方案1】:

我认为你的控制器方法应该是这样的:

public FileContentResult DownloadPDF()
{
    string htmlToConvert = RenderViewAsString("~/Content/Eula.htm");

    HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
    byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory(htmlToConvert,null);

    return File(pdfBuffer, "application/pdf", "Download.pdf");
}

我在文件下载方面没有太多经验,但类似的代码可以让我下载 excel 文件。

我发现this post 专门讨论了下载 PDF。它概述了 ActionResultFileResult 之间的区别 - ActionResult 不包含内容类型。它还解释了基于FileResult 的不同结果:

如果您要传输的内容存储在磁盘文件中,您 可以使用 FilePathResult 对象。如果您的内容可用 通过您使用 FileStreamResult 并且您选择的流 FileContentResult 如果您将其作为字节数组提供。所有这些 对象派生自 FileResult 并且仅在 他们将数据写入响应流的方式。

编辑:经过一番搜索,我相信我找到了问题的根源。您也许可以使用相同的代码,但您需要调用 WriteFile 将内容写入响应流 - 默认情况下使用 File(...) 会这样做:

通过此方法准备的结果对象被写入 执行对象时 ASP.NET MVC 框架的响应。

有关更多信息,请参阅 MSDN 文档:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-25
    • 2016-10-11
    • 2016-09-17
    相关资源
    最近更新 更多