1

在我的页面上,我目前有以下内容:带有一些发票的 webgrid,对于每张发票我都有一个复选框,对于每张发票我都有一个 pdf 图标,可以在浏览器中查看 pdf 或下载 pdf。

我想要完成的是用户可以检查一些发票并点击下面的按钮将这些发票下载为 ZIP 文件。

单击按钮时,会调用一个 jquery 函数,该函数会对我的 ASP.net 进行 AJAX 调用。我传递了发票相应 ID 的数组参数。

jQuery - Ajax 调用

$("#download").click(function () {
    var idArray = [];
    $("input[type=checkbox]").each(function () {

        if (this.checked)
        {
            idArray.push($(this).val());
        }
    });

    $.ajax({
        traditional: true,
        type: "GET",
        url: "/Invoices/downloadInvoices",
        data: { idArray: idArray },
        error: function () {
            alert("error");
        }
    }).done(function (data) {
        console.log("succes download function");
    });
});

此功能按预期工作,在我的控制器中我收到了数组。下一步是获取相应的文件(来自数据库的base64)转换这些文件并将这些文件放入ZIP。这也有效,当我检查 ZIP 的条目时,它具有正确的内容。

控制器

    public ActionResult downloadInvoices(string[] idArray) 
    {
        MemoryStream outputStream = new MemoryStream();

        outputStream.Seek(0, SeekOrigin.Begin);

        using (ZipFile zip = new ZipFile()) 
        {
            foreach (string id in idArray) 
            {
                string json = rest.getDocumentInvoice(Convert.ToInt32(id));
                byte[] file = json.convertJsonToFile();
                zip.AddEntry("invoice" + id + ".pdf", file);
            }
            zip.Save(outputStream);
        }

        outputStream.WriteTo(Response.OutputStream);
        Response.AppendHeader("content-disposition", "attachment; filename=invoices.zip"); 

        Response.ContentType = "application/zip";
        //return File(outputStream, "application/zip", fileDownloadName:"invoices.zip"); -- DIDN'T WORK

        return new FileStreamResult(outputStream, "application/zip") { FileDownloadName = "invoices" };
    }

我需要的最后一步是用户看到弹出窗口以保存 zip 文件,但这不会发生。当我检查我的调试器时,ajaxcall 已成功完成。当我检查调试器(标头)时,我看到了请求,但响应标头显示 contentlength : 0。

我错过了什么,在网上找不到任何解决方案。希望你能帮助我。

提前致谢

编辑

{ FileDownloadName = "发票" }

删除这段代码后,我的 contentlength 不再为 0。但是现在如何下载这个文件呢?请求发送的内容看起来像文件,但没有显示下载文件的弹出窗口。

4

3 回答 3

1

zip文件应该在dataevent 的参数中done,但是当您进行 ajax 查询时,您将看不到用户下载文件的弹出窗口。

您可以在我的权宜之计中执行两个选项,第一个是使用表单发送数据,然后在属性target中将值放入_blank新窗口或放置例如mywindow并执行以下操作window.open

window.open('about:blank', 'mywindow');

第二个选项是通过ajax发送数据并接收一个ok或失败的json对象,如果操作正常,将文件保存在某处并在正常响应时,您可以发送一个id然后执行类似于第一个选项的操作,但确保该文件生成得很好,并且在您的控制器中的其他操作中接收id并发送zip文件。

于 2013-09-13T13:53:33.810 回答
0

Ajax 不允许下载文件。这是出于安全原因。

所以要下载文件,不要使用 AJAX。创建一个指向您的服务器端脚本的锚点,该脚本为要下载的文件提供服务。

于 2013-09-13T13:50:33.130 回答
0

也许我错了,但对我来说,您似乎需要将内存流倒回到开头才能发送其内容,添加一个

outputStream.Seek(0, SeekOrigin.Begin);

outputStream.WriteTo(Response.OutputStream);

然后再试一次 :)

于 2013-09-13T15:00:37.930 回答