正确填充 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
文件应该在 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);
然后重试:)