【问题标题】:Zip file not downloading after zip was correctly filled but contentlength is empty正确填充 zip 后未下载 Zip 文件但 contentlength 为空
【发布时间】:2013-09-13 12:43:46
【问题描述】:

在我的页面上,我目前有以下内容:带有一些发票的 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。但是现在如何下载这个文件呢?请求发送的内容看起来像文件,但没有显示下载文件的弹出窗口。

【问题讨论】:

    标签: c# asp.net ajax asp.net-mvc dotnetzip


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        outputStream.Seek(0, SeekOrigin.Begin);
        

        之前

        outputStream.WriteTo(Response.OutputStream);
        

        然后再试一次:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-12
          • 2013-08-26
          • 1970-01-01
          • 2023-04-07
          • 2014-09-19
          • 1970-01-01
          • 1970-01-01
          • 2014-10-14
          相关资源
          最近更新 更多