正确填充 zip 后 zip 文件未下载,但内容长度为空

本文关键字:zip 下载 填充 文件 | 更新日期: 2023-09-27 18:31:16

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

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

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

jQuery - Ajax-call

$("#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 成功完成。当我检查调试器(标头)时,我看到请求,但响应标头显示内容长度:0。

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

提前致谢

编辑

{ 文件下载名称 = "发票" }

当这段代码被删除时,我的内容长度不再是0。但是现在如何下载此文件?请求发送的内容看起来像文件,但未显示用于下载文件的弹出窗口。

正确填充 zip 后 zip 文件未下载,但内容长度为空

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

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

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

第二个选项是通过 Ajax 发送数据并接收具有 OK 或 FAILURE 的 JSON 对象,如果操作正常,则将文件保存在某个地方,在 OK 响应上,您可以发送id,然后执行类似于第一个选项的操作,但确保文件生成正常,并在控制器中的其他操作中接收id并发送zip文件。

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

因此,要下载文件,请不要使用 AJAX。创建一个定位点,指向提供要下载的文件的服务器端脚本。

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

outputStream.Seek(0, SeekOrigin.Begin);

以前

outputStream.WriteTo(Response.OutputStream);

然后重试:)