【问题标题】:C# ASP.NET MVC: How do I get the browser to automatically download a pdf from my response?C# ASP.NET MVC:如何让浏览器从我的响应中自动下载 pdf?
【发布时间】:2017-07-17 03:30:03
【问题描述】:

我创建了一个 ASP.NET MVC Web 应用程序,我在其中通过 AJAX 帖子接受来自客户端的一些信息,并使用 iTextSharp 创建一个 pdf。在向客户端返回响应时,我希望浏览器自动将 pdf 下载到用户的计算机上。我首先将文件实际保存到一个文件夹并返回绝对路径,所以我知道代码成功生成了 pdf。但是,我没有返回实际路径,而是读到我可以将其存储在 MemoryStream 中并将其放入我的响应中。我尝试返回实际的 MemoryStream,将其转换为字节数组并返回,返回 FileStreamResult,并将 MemoryStream 添加到响应中,但似乎没有任何效果。我知道有人问过类似的问题,但我发现的代码似乎都没有解决我的问题。有人可以告诉我我需要在代码中更改什么来完成此操作吗?

AJAX 代码:

.ajax({
    url: "/Reports/GenShoppingList",
    type: "Post",
    contentType: "application/json; charset=utf-8",
    data: JSON.stringify(recipeIdArray),
    datatype: "application/pdf"
 });

Pdf 创建和响应代码:

public static void GenShoppingListPDF(StringBuilder ingredientNames)
{
    MemoryStream MemoryStream = new MemoryStream();
    doc = new Document();
    PdfWriter.GetInstance(doc, MemoryStream).CloseStream = false;
    doc.Open();
    doc.Add(new Paragraph(ingredientNames.ToString()));
    doc.Close();
    string fileName = "ShoppingList-" + DateTime.Now.ToString() + ".pdf";
    HttpResponse response = HttpContext.Current.Response;
    response.Clear();
    response.ContentType = "application/pdf";
    response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
    response.BinaryWrite(MemoryStream.ToArray());
    response.Flush();
    response.Close();
    response.End();
}

StringBuilder 对象通过控制器操作传递到代码中,该控制器操作简单地创建对象并调用此静态方法。控制器操作返回类型为 void。

最终解决方案:通过进一步研究和讨论,我得出结论,JQuery AJAX 不支持发布数据和返回 pdf。相反,最好简单地使用一个普通的 XMLHttpRequest 并放弃使用 JQUERY。

【问题讨论】:

  • 您遇到什么错误?或者代码怎么不起作用?
  • 我相信SO answerthis one可能对你有帮助。此外,考虑使用 FileResult 类,它真的很有用,您甚至可以制作一个自定义 PDFFileResult 类,该类可以嵌入内容类型和 addheader 逻辑,这样如果您需要在任何地方使用它,您就可以干了e.g.
  • @mroach 没有抛出异常,但文件不会自动触发 pdf 的下载。我可以使用成功:function(result){ alert(success.toString()); },它将显示我认为应该是响应的字节 [] 信息。
  • @JudgeBread 第一个选项只是使用不同的 dll,如果可能的话,我想使用 iTextSharp。其他人已经成功地使用了它,所以我不明白为什么我最终不能让它工作。我已经尝试了第二个帖子,但没有成功。我认为这与我的 AJAX 调用或我使用 [HttpPost] 数据注释的事实有关。在您看来,其中任何一个都有意义吗?
  • 嗨,大卫,这两个链接都是针对 iTextSharp 的,所以我不知道您所说的不同 dll 是什么意思 - 您是指不同的版本吗?其次,HttpPost 不应该造成问题。我看到的问题是 jquery 的 ajax 调用。在彻底搜索它的同时,我看到许多人和你在同一条船上使用黑客。搜索 jquery ajax pdf 下载。更好的解决方案是在页面上有一个隐藏的表单。填写您的成分名称并使用jquery 发布。那么表单提交的响应就会触发下载。可以试试吗?

标签: c# asp.net asp.net-mvc pdf itext


【解决方案1】:

查看您正在使用的库,这对我有用并正确下载文件。

public ActionResult File()
{
  string ingredientNames = "Hello David";
  using (MemoryStream stream = new MemoryStream())
  {
    var doc = new Document();
    PdfWriter.GetInstance(doc, stream).CloseStream = false;

    doc.Open();
    doc.Add(new Paragraph(ingredientNames.ToString()));
    doc.Close();

    return File(stream.ToArray(), System.Net.Mime.MediaTypeNames.Application.Pdf, "file.pdf");
  }
}

【讨论】:

  • 也许错误来自 ajax 调用呢?我使用了您提出的代码,但它没有导致自动下载。 AJAX 调用是否需要我返回一些东西给它使用?另一件可能让我抓狂的事情是我的操作上的 [HttpPost] 数据注释。你怎么看?
  • OHHHHHH 我现在明白你了。您可以在浏览器的新链接中打开此 url,并为您下载浏览器。 var url='localhost:1000/Home/File'; window.open(url, '下载');
  • 我会传入什么 url 作为参数?文件直接从服务器传递。
【解决方案2】:

最终解决方案:通过进一步研究和讨论,我得出结论,JQuery AJAX 不支持发布数据和返回 pdf。相反,最好简单地使用一个普通的 XMLHttpRequest 并放弃使用 JQUERY。

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 2012-12-06
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    相关资源
    最近更新 更多