在我的页面上,我目前有以下内容:带有发票的webgrid,每张发票都有一个复选框,每张发票我都有一个pdf-Icon,可以在浏览器中查看pdf或下载pdf。
我想要完成的是用户可以检查一些发票并点击下面的按钮将这些发票下载为ZIP文件。
当单击该按钮时,将调用一个jquery函数,该函数对我的ASP.net进行AJAX调用。我传递了发票的相应ID的数组参数。
$("#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 =“发票”}
当删除这段代码时,我的内容长度不再为0。但是现在如何下载此文件?请求发送的内容类似于文件,但下载文件的弹出窗口未显示。
答案 0 :(得分:1)
zip
文件应该在data
,即事件done
的参数,但是当您进行ajax查询时,您将看不到用户下载的弹出窗口文件。
您可以在我的权宜之计中做两个选项,第一个是使用表单发送数据,并在属性target
中将值_blank
放到新窗口或放置例如{{ 1}}并使用mywindow
:
window.open
第二个选项是通过ajax发送数据并接收带有ok或失败的json对象,如果操作正常将文件保存到某个地方并且ok响应你可以发送window.open('about:blank', 'mywindow');
然后执行类似的操作第一个选项,但确保文件生成正常,并在控制器的其他操作中重新调用id
并发送id
文件。
答案 1 :(得分:0)
Ajax不允许下载文件。这是出于安全原因。
所以要下载文件,请不要使用AJAX。创建一个指向服务器端脚本的锚点,该脚本提供要下载的文件。
答案 2 :(得分:0)
也许我错了,但对我来说,看起来你需要在发送内容之前将内存流倒回到开头, 加一个
outputStream.Seek(0, SeekOrigin.Begin);
前
outputStream.WriteTo(Response.OutputStream);
再试一次:))