1

ajax json MVCコントローラーを介してファイルをダウンロードしようとすると、機能しません。MIME 応答が得られません。ウィンドウ内のテキストとしてレンダリングするだけです。フォーラムで言及されているすべてのオプションを試しましたが、うまくいきませんでした。助けてください。コントローラーは適切なファイルを送り返しますが、javascript ajax はそれを json としてレンダリングします。ダウンロード ボタンをクリックしたときに、ファイルの「保存」または「開く」ファイル応答ヘッダー プロンプトを取得したいと考えています。

 $("#btnDownloadEDIFile").bind("click", function (e)
    {
        e.preventDefault();
        displayAjaxLoading(true);

        $.ajax({
            type: 'POST',
            dataType: "json",
            async: false,
            contentType: 'application/json; charset=utf-8',
            url: '@Url.Action(MVC.AccountsPayable.StagedInvoice.DownloadFile())',
            data: JSON.stringify({ StagedFileId: $('#StagedFileId').val() , FilePath:      $('#FilePath').val() , SourceFileName: $('#SourceFileName').val() }),
            success: function (result) {
                //alert(result);
                if (result != "") {
                    displayNotoficationError([result]);
                }
                else {

                }

            },

            error: function (result) {
                //debugger;
                alert(result);
                displayNotoficationError([result]);
            }
        });
    });

これを実行すると、ウィンドウにテキストとしてレンダリングされ、javascript で ajax エラーがスローされます。

ここにコントローラーコードがあります

  public virtual ActionResult DownloadFile(Nullable<int> StagedFileId, string FilePath, string SourceFileName)
    {

        string _FullPath = _WebApplicationConfiguration.SourceStagedInvoiceFileFolder + FilePath;
        if (System.IO.File.Exists(_FullPath))
        {

            HttpContext.Response.ClearContent();
            HttpContext.Response.ContentType = "application/octet-stream";

            HttpContext.Response.AddHeader("content-disposition",

                                                   "attachment; filename=" + SourceFileName);

            HttpContext.Response.BinaryWrite(System.IO.File.ReadAllBytes(_FullPath));
            return File(_FullPath, "text/octet-stream", SourceFileName);

        }
        else
        {

            return Content("");
        }
    }
4

1 に答える 1

0

私はこれがあなたがやろうとしていることとまったく同じではないことを知っていますが、私はまったく異なるアプローチにかなり満足しています。この方法では、ファイルがどのようにリンクされているか、またはどのブラウザが使用されているかに関係なく、[ダウンロード/開く]ダイアログが強制されます。あなたがしなければならないのは、この振る舞いをしたいすべてのファイルが指定されたフォルダ、この場合は/Libraryにあることを確認することです。

これを、従来のAsp.NetまたはMVCのいずれかのGlobal.asaxファイルに追加します。

protected void Application_BeginRequest()
{
    if (Request.Path.Contains("/Library/") && (File.Exists(Request.PhysicalPath)))
    {
        var fileInfo = new FileInfo(Request.PhysicalPath);

        Response.Clear();
        Response.TransmitFile(Request.Path);
        Response.AddHeader("Content-Disposition", "attachment;filename=" + fileInfo.Name);
        Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        Response.Flush();
        Response.End();
    }
}

このサイトからアイデアを得ましたが、クレジットを与えるためのリンクが見つかりません。ごめん。

于 2013-03-07T03:31:45.770 に答える