C# jquery ajax中的ASP.NET MVC FileContentResult下载文件
在我看来,我使用ajax jquery对我的控制器进行GET调用,它返回一个FileContentResult,这是一个excel文件,它返回的是什么。该文件是即时创建的,它不在服务器上,我无法通过url下载该文件,因为它不存在 如果我从控制器返回FileContentResult,它对我有效,但在页面上,用户不知道下载何时完成或是否继续下载,我需要知道下载是否仍在进行中,以及下载是否已完成。我无法显示弹出窗口,因为我不知道下载是否继续,我只知道在我的浏览器中看到下载的文件时,该文件已被下载 控制器代码:C# jquery ajax中的ASP.NET MVC FileContentResult下载文件,c#,jquery,asp.net,asp.net-mvc,file,C#,Jquery,Asp.net,Asp.net Mvc,File,在我看来,我使用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请求的请求中,必须添加响应类型'arrayBuffer'
var xhrOverride = new XMLHttpRequest();
xhrOverride.responseType = 'arraybuffer';
$.ajax({
url: url,
method: 'POST',
xhr: function () {
return xhrOverride;
}
}).done(function (data, status, xhr) {
//request correct
}
你可以在这里找到答案,不要把答案作为你问题的一部分。这是一个问答网站,它遵循特定的格式。如果您找到了答案,请将其单独添加到下面的答案部分。通过这种方式,人们可以对答案进行投票,并在搜索结果中显示。另请参阅,谢谢。我没有15%的声誉,根据您给我的链接,我需要15%的声誉才能为我的问题添加我自己的答案。这就是为什么我在这个问题上添加了我自己的答案。你可以在这里找到答案。不要添加答案作为你问题的一部分。这是一个问答网站,它遵循特定的格式。如果您找到了答案,请将其单独添加到下面的答案部分。通过这种方式,人们可以对答案进行投票,并在搜索结果中显示。另请参阅,谢谢。我没有15%的声誉,根据您给我的链接,我需要15%的声誉才能为我的问题添加我自己的答案。这就是为什么我对这个问题增加了我自己的答案。