c# - 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
}
解决方案
推荐阅读
- ios - Xcode 10.1 - Swift 4.2 - locationManager(_:didUpdateLocations:) 已重命名为 locationManager(_:didUpdate:)
- javascript - 检查嵌入在另一个数组中的数组中的文档之间的差异
- java - next() vs Single() 哪个有效?
- sql-server - SQL 语法计算多个餐单 ID 中每个餐单 ID 的总菜单项
- android - 基于 mediarecorder 的 Camera2 应用程序录制低质量的视频。有人知道为什么吗?
- python - 在 Python 中将连接日期更改为日期时间
- php - Laravel 显示错误 App\Http\Controllers\UserController::admin_side_update() 的参数太少,通过了 1 个,预期正好有 2 个
- php - PhpStorm 代码检查允许在没有类型的对象上调用方法
- regex - Conditionals and regex doubts with grok filter in logstash
- json - Kafka Connect,获取 JsonConverter 的 Json Schema