我的问题是我首先发送给客户端 PDF 下载,然后我需要检查,如果我的数据库中存在一些数据,然后根据该检查我需要显示问题,如果用户想要下载另一个 PDF,那我生成。
我的代码:
//Here I just make dialog for question
$('#printDWInfo').dialog({
resizable: false,
modal: true,
autoOpen: false
});
//Here is my problem :)
$('#generujWydruk').click(function (event) {
event.preventDefault();
$('#printForm').submit(); // <-- sending first request and client get first PFD file
$.post('<%: ResolveUrl("~/Reports/KPiRReportDWCheck") %>', <-- check for another data
$("#printForm").serialize(),
function(data) {
if (data.length > 0) {
$("#printDWInfo").dialog( "option", "buttons", [
{
text: "Tak",
click: function () {
$.ajax({ type: "POST",
url: '<%= Url.Action("PrintDWList","Reports")%>',
datatype: "json",
traditional: true,
data:{'ids': data },
success: function (data2) {
//I don't know what to do here
}
});
$(this).dialog("close");
}
}, {
text: "Nie",
click: function () {
$(this).dialog("close");
}
}
]);
$('#printDWInfo').dialog("open");
}
}
);
如果客户点击对话框中的“Tak”按钮,我使用ajax请求,因为我可以传递给 Controller 的int数组,由$.post('<%: ResolveUrl("~/Reports/KPiRReportDWCheck") %>'
返回.
在我的 ajax 请求的成功函数中,FireBug 告诉我 data2
是我的 PDF 文件的二进制数据,我需要做什么才能让客户下载这个 PDF 文件?
最佳答案
In success function of my ajax request FireBug show me that data2 is binary data of my PDF file, what I need to do to allow client to download this PDF file?
您不应使用 AJAX 下载文件。问题是您在 AJAX 调用的成功回调中获取 javascript 变量中的 pdf 字节,但您无能为力。你不能提示用户保存它,当然你不能将它保存到客户端,因为 javascript 没有必要的权限。
所以你应该使用一个普通的请求:
var downloadUrl = '<%= Url.Action("PrintDWList", "Reports")%>?' + $.param({ ids: data }, true);
window.location.href = downloadUrl;
请注意,这将向传递 ids 查询字符串参数的 PrintDWList
操作发送 GET 请求,因此请确保可通过 GET 访问此操作。现在,如果 Controller 操作使用 Content-Disposition header 作为附件,它将为用户提供下载文件的机会:
public ActionResult PrintDWList(int[] ids)
{
byte[] pdf = ...
return File(pdf, "application/pdf", "file.pdf");
}
关于javascript - 如何允许下载以二进制数据形式从 AJAX 返回的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8164636/