【发布时间】: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。
【问题讨论】:
-
您遇到什么错误?或者代码怎么不起作用?
-
@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