【问题标题】:How to return a PDF in an action result in MVC如何在 MVC 中的操作结果中返回 PDF
【发布时间】:2015-07-19 05:20:42
【问题描述】:

我在解决这个问题时遇到了一些问题。我有一个 ajax 调用,它应该呈现一个加载 PDF 的 iframe。 PDF 是使用托管在另一个环境中的 Apache FOP 生成的。到目前为止我所拥有的是:

在控制器动作中(iFrame的src元素指向的地方),代码sn-p为:

var targetStream = new MemoryStream();    
using (var response = FOPrequest.GetResponse()) // response from FOP
                {
                    using (var stream = response.GetResponseStream())
                    {
                        stream.CopyTo(targetStream);

                    }
                }
 return new FileStreamResult(targetStream, "application/pdf");

但是,这并没有按预期工作。流按预期填充,但 PDF 未在 iFrame 中呈现。 我得到 200(OK)的 Http 响应代码。

如果有任何帮助,我将不胜感激。

【问题讨论】:

标签: c# ajax asp.net-mvc pdf iframe


【解决方案1】:

你使用 MVC FileContentResult 返回 ActionResult 例如:

return File(fileArray, contentType, fileName)

另一个堆栈Answer

【讨论】:

    【解决方案2】:

    你可以像这样使用FileResult的返回类型:

    public FileResult getFile(string CsvName)
    {
       //Add businees logic here
       byte[] fileBytes = System.IO.File.ReadAllBytes(System.Web.Hosting.HostingEnvironment.MapPath("~/Content/Uploads/records.csv"));
       string fileName = CsvName;
       return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
    }
    

    可能不是确切的解决方案,您可以自己操作和开发。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      通过 nuget 安装 MvcPdfActionResult

      PM> Install-Package MvcPdfActionResult
      

      只需在控制器中使用返回类型作为 PdfActionResult 将输出 PDF 文档而不是 HTML。这将使用 iTextXmlWorker 库将 HTML 转换为 PDF。

        ...
        return PdfActionResult(model);
      }
      

      在 asp.net 5 MVC 项目中从您的 razor 视图生成 pdf 文档。 https://www.nuget.org/packages/MvcPdfActionResult/

      【讨论】:

        【解决方案4】:

        对于 FileStreamResult,您的 targetStream 需要仍处于打开状态。 “使用”部分关闭了您的响应流,看起来您的 targetStream 也关闭了......

        当我使用未关闭的 MemoryStream 时 - 您的代码有效!感谢 Natan Cooper 的评论和链接,我得到了它。

        【讨论】:

          【解决方案5】:

          虽然标准操作结果 FileContentResult 或 FileStreamResult 可用于下载文件,但为了可重用性,创建自定义操作结果可能是最佳解决方案。创建自定义操作结果 PDFResult。

          PDFResult 类继承抽象 ActionResult 类并覆盖 ExecuteResult 方法。

          public class PDFResult : ActionResult
          {
              private readonly byte[] fileContents;
              private string fileName;
          
              public PDFResult(byte[] contents, string filename)
              {
                  this.fileContents = contents;
                  this.fileName = filename;
              }
          
              public override void ExecuteResult(ControllerContext context)
              {
                  var response = context.HttpContext.Response;
                  response.Clear();
                  response.ContentType = "application/pdf";
                  response.AddHeader("content-disposition", string.Format(@"attachment;filename=""{0}""", fileName));
                  response.BinaryWrite(fileContents);
              }
          }
          

          在Controller中使用自定义的PDFResult操作结果如下

          [HttpGet]
          public async Task<PDFResult> ExportToPDF()
          {
              var model = new Models.MyDataModel();
              byte[] fileContents = await model.GetFileContents();
              string filename = "myfile.pdf";
              return new PDFResult(fileContents, filename);
          }
          

          由于我们使用 HttpGet 下载文件,因此创建一个没有模型和空布局的空视图。

          关于下载动态创建的文件的自定义操作结果的博文:

          https://acanozturk.blogspot.com/2019/03/custom-actionresult-for-files-in-aspnet.html

          【讨论】:

            猜你喜欢
            • 2016-01-03
            • 2013-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多