首页 > 解决方案 > jquery ajax 中的 ASP.NET MVC FileContentResult 下载文件

问题描述

从我的角度来看,我使用 ajax jquery 对我的控制器进行了 GET 调用,它返回一个 FileContentResult 这是它返回的一个 excel 文件。该文件是立即创建的,它不在服务器上,我无法通过 url 下载文件,因为它不存在。

如果我从控制器返回 FileContentResult 它对我有用,但是在页面上用户不知道下载何时完成或是否继续下载,我需要知道下载是否仍在进行中以及下载是否有完成的。我无法显示弹出窗口,因为我不知道下载是否继续,我只知道当我在浏览器下载时看到文件已下载。

控制器代码:

DataTable table = new DataTable("MyExcel");
string contentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.ContentType = contentType;
Response.AddHeader("Content-disposition", "attachment; filename=MyExcel.xlsx");
return File(Utils.XLS(table), contentType, "MyExcel.xlsx");

**Utils.XLS(table):** this function return byte[] from table

excel文件生成正确,我检查过了。

调用 Ajax 完成后,我检索数据并执行以下操作:

$.get(url, function (data, status, xhr) {
    var contentType = xhr.getResponseHeader("Content-Type");
    var filename = xhr.getResponseHeader("Content-disposition");
    filename = filename.substring(filename.lastIndexOf("=") + 1);
    var blob = new Blob([data], {
             type: contentType
    );
    var url = URL.createObjectURL(blob);
    var link = document.createElement('a');
    link.href = url;
    link.download = filename;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
});

excel 文件下载成功,但显示已损坏且内部不包含任何信息。我尝试了很多我一直在寻找的方法,但没有一个对我有用。

解决方案

在 ajax 请求的请求中,您必须添加 responsetype 'arrayBuffer'

var xhrOverride = new XMLHttpRequest();
xhrOverride.responseType = 'arraybuffer';

$.ajax({
     url: url,
     method: 'POST',
     xhr: function () {
          return xhrOverride;
     }
}).done(function (data, status, xhr) { 
   //request correct
}

标签: c#jqueryasp.netasp.net-mvcfile

解决方案


推荐阅读