4

私のビューには次のようなものがあります。

        var url = '@Url.Action("DownloadZip", "Program")' + '?programNums=' + selectedRow;

        $.ajax({
            url: url,
            dataType: 'json',
            async: false,
            success: function (data) {
                if (data != "Successful") {
                    alert(data);
                }
            }
        });

コントローラはファイルを返すか、エラーが発生した場合はJSONの結果を返すことができます。両方を一緒に動作させることができていません。

これがどのように見えるかです:

    public ActionResult DownloadZip(string programNums)
    {

        if(string.IsNullOrEmpty(programNums))
        {
          return Json("Error, blank info sent.", JsonRequestBehavior.AllowGet);
        }            

        var memoryStream = new MemoryStream();

        using (var zip = new ZipFile())
        {
            zip.AddFile("C:\\sitemap.txt");
            zip.Save(memoryStream);
        }

        memoryStream.Seek(0, 0);
        return File(memoryStream, "application/octet-stream", "archive.zip");

    }

私が見ているのは、ajax呼び出しにはJSON値が必要であるということです。私の場合、ファイルを返すので動作しません。とにかく、ajax呼び出しからJSONまたはファイルを返すことができる場所に私が行っていることを処理します。

4

4 に答える 4

3

この実装では多くの問題が発生すると思います。実際には、AJAXを介してファイルをアップロードまたはダウンロードすることはできません。以下のリンクを参照してください。

jQueryAJAXとSpringMVC3を使用してサーバーからファイルをダウンロードする方法

上記の質問で共有された2つの実装のいずれかを使用する必要があります。IFRAMEメソッドを使用すると、jQueryを使用して、ドキュメントがいつ完了したか、およびドキュメントが成功したかどうかを確認できる場合があります。

編集:サーバー例外(500)をスローするだけです。IFRAMEから500をどのように処理するかはあなた次第です。

于 2012-12-18T21:10:32.957 に答える
2

ファイルURLを使用してJSONを返すことを検討しましたか?

ファイルが正常に検出/作成された場合。ファイルへのリンクを含むJSON結果を送り返します。次に、javascriptwindows.locationでファイルを取得するために使用します。エラーが発生した場合、JSONの結果にはエラー情報が含まれ、この情報をユーザーに表示できます。これを機能させるには、ファイルをストリーミングできる別のエンドポイント(アクション)を作成する必要があります。

于 2012-12-18T21:21:31.563 に答える
2

バイナリデータをAjaxリクエストにストリーミングできないため、コードが機能することはありません。書き込む通常の応答コンテキストがありません。

あなたはいくつかのアプローチを取ることができます:

  1. 検証に合格した場合は、データをユーザーにストリーミングする別のハンドラーへの新しいリンクを返すだけです。次に、Javascriptコールバック関数でこのリンクを読み、新しいウィンドウで開きます。
  2. 上記でDANNaticが提案したように、IFRAMEを使用します。
  3. より複雑:Base64-バイナリデータをエンコードし、Json結果の一部として返します。base64でエンコードされたファイルを読み取り、Javascriptを使用してデコードし(これを行うためのライブラリはオンラインで多数見つかります)、結果に対して何か*を実行します。

ZIPファイルの場合、何ができるかわかりません。この手法を使用すると、ブラウザ内でPDFファイルをインラインで表示できる場合がありますが、すべてのブラウザで機能するかどうかは非常に疑わしいです。私のアドバイスは、オプション1を使用することです。

于 2012-12-18T21:30:03.450 に答える
1

Ajax:window.location ='/ Home / download';

c#:

        public FileResult download()
        {
           return File("~/" + path, "application/pdf", string.Format(fileName));
        }
于 2014-12-15T08:23:31.130 に答える