0

我正在尝试使用 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
4

1 回答 1

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 文件。

我发现这篇文章专门讨论了下载 PDF。ActionResult它概述了和FileResult-之间的区别,ActionResult不包含内容类型。它还解释了建立在以下基础上的不同结果FileResult

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

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

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

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

于 2013-06-07T03:33:27.720 回答