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