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 回答