1

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

4

3 に答える 3

1

zipファイルはdataevent のパラメーターである必要がありdoneますが、ajax クエリを作成しているため、ユーザーがファイルをダウンロードするためのポップアップは表示されません。

私の都合で2つのオプションを実行できます.1つ目は、フォームでデータを送信し、属性targetに値_blankを入力して新しいウィンドウに移動するか、たとえば、次のように入力mywindowしてこれを行うことですwindow.open:

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

2番目のオプションは、ajaxでデータを送信し、OKまたは失敗でjsonオブジェクトを受信することです。アクションがOKの場合、ファイルをどこかに保存し、OK応答で送信しidてから、最初のオプションと同様のことを行いますが、そのファイルを確認します正常に生成され、コントローラーの他のアクションで、ファイルを recibe しidて送信しzipます。

于 2013-09-13T13:53:33.810 に答える
0

たぶん私は間違っているかもしれませんが、私には、コンテンツを送信する前にメモリストリームを最初に巻き戻す必要があるように見えます.1つ追加してください

outputStream.Seek(0, SeekOrigin.Begin);

outputStream.WriteTo(Response.OutputStream);

そしてさらに試みる :)

于 2013-09-13T15:00:37.930 に答える
0

Ajax はファイルのダウンロードを許可しません。これはセキュリティ上の理由によるものです。

したがって、ファイルをダウンロードするには、AJAX を使用しないでください。ダウンロードするファイルを提供するサーバー側スクリプトを指すアンカーを作成します。

于 2013-09-13T13:50:33.130 に答える