私のページには現在、次のものがあります。いくつかの請求書を含むWebグリッド、請求書ごとにチェックボックスがあり、請求書ごとに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 ではなくなります。しかし、どうすればこのファイルをダウンロードできるのでしょうか? リクエストが送信するコンテンツはファイルのように見えますが、ファイルをダウンロードするためのポップアップは表示されません。