javascript - 如何允许下载以二进制数据形式从 AJAX 返回的文件

标签 javascript jquery ajax asp.net-mvc-2

我的问题是我首先发送给客户端 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/

相关文章:

javascript - 图表.js v2 : Align time scale labels with the center of the bars

javascript - 如何知道单击了哪个图像,然后隐藏了一个透明的地方,看不到其他图像

javascript - Jquery 模拟点击 <div role = button>

javascript - 如何使用 jquery/javascript 获取选中复选框的所有值?

javascript - 使用 jquery 或 javascript 动态创建 Bootstrap slider

javascript - Node : TypeError: Object #<Object> has no method 'connect'

javascript - Angular then 不会触发递归函数上的 Promise

Javascript 在其他函数完成后执行函数

angularjs - Angular使用ajax获取JSON数据

javascript - 使用Ajax传递Json变量并解码