小编典典

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

ajax

我的问题是,我先发送给客户端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请求,因为我可以传递给int的控制数组,该数组由返回$.post('<%: ResolveUrl("~/Reports/KPiRReportDWCheck") %>'。在我的ajax请求的成功功能中,FireBug告诉我这data2是我的PDF文件的二进制数据,我该怎么做才能允许客户端下载该PDF文件?


阅读 271

收藏
2020-07-26

共1个答案

小编典典

在我的Ajax请求成功功能FireBug中,向我展示data2是我的PDF文件的二进制数据,我需要做些什么才能允许客户端下载该PDF文件?

您不应该使用AJAX下载文件。问题是您正在AJAX调用的成功回调中的javascript变量中获取pdf字节,但是您无能为力。您不能提示用户将其保存,当然也不能将其保存到客户端,因为javascript没有必要的特权。

因此,您应该使用正常的请求:

var downloadUrl = '<%= Url.Action("PrintDWList", "Reports")%>?' + $.param({ ids: data }, true);
window.location.href = downloadUrl;

请注意,这会将GET请求发送给PrintDWList传递ids查询字符串参数的操作,因此请确保此操作可在GET上访问。现在,如果控制器操作使用Content-
Disposition标头附加附件,它将为用户提供下载文件的方法:

public ActionResult PrintDWList(int[] ids)
{
    byte[] pdf = ...
    return File(pdf, "application/pdf", "file.pdf");
}
2020-07-26