You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core中Ajax调用返回FileContentResult无文件下载问题求助

问题核心

Ajax请求的响应会被JavaScript引擎接管,而非直接交由浏览器处理文件下载逻辑。只有当浏览器接收到表单提交或页面直接导航返回的文件流时,才会自动触发下载对话框。这就是方法1(表单提交)正常,方法2(Ajax)无反应的原因。

解决方法

方法一:处理Ajax响应,手动触发下载

修改前端Ajax代码,指定响应类型为blob,在成功回调中创建下载链接并触发点击:

var rows = $("#report").jqxGrid('getrows');
var loans = [];

for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    loans.push({
        "loanNumber": row.loanNumber,
        "loanType": row.loanType
    });
}

$.ajax({
    data: JSON.stringify(loans),
    contentType: "application/json",
    url: "/Reports/ExportLoansReport",
    type: "POST",
    xhrFields: {
        responseType: 'blob' // 关键:声明接收二进制Blob数据
    },
    success: function(blob) {
        // 生成临时下载链接
        const downloadUrl = window.URL.createObjectURL(blob);
        const aTag = document.createElement('a');
        aTag.href = downloadUrl;
        aTag.download = "Loans-Export.xlsx"; // 指定文件名
        document.body.appendChild(aTag);
        aTag.click();
        
        // 清理临时资源
        window.URL.revokeObjectURL(downloadUrl);
        document.body.removeChild(aTag);
    },
    error: function() {
        alert("导出失败,请稍后重试");
    }
});

方法二:改用动态表单提交(替代Ajax)

如果不想处理Blob数据,可以动态创建表单提交JSON数据,让浏览器自动处理下载:

前端代码

var rows = $("#report").jqxGrid('getrows');
var loans = [];

for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    loans.push({
        "loanNumber": row.loanNumber,
        "loanType": row.loanType
    });
}

// 动态创建表单
const form = document.createElement('form');
form.action = "/Reports/ExportLoansReport";
form.method = "POST";

// 添加隐藏字段存储JSON数据
const input = document.createElement('input');
input.type = 'hidden';
input.name = 'exportData';
input.value = JSON.stringify(loans);

form.appendChild(input);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);

后端调整参数接收

将原[FromBody]改为[FromForm],接收字符串后反序列化为目标模型:

[HttpPost]
public IActionResult ExportLoansReport([FromForm] string exportData)
{
    var model = JsonSerializer.Deserialize<List<LoansReportExportViewModel>>(exportData);
    // 后续Excel生成逻辑与原代码一致...
}
补充说明
  • 方法一适合中小文件导出,大文件可能因Blob占用内存过高出现问题;
  • 方法二更适合大文件场景,表单提交的方式更贴近浏览器原生下载逻辑;
  • 确保后端返回的File结果中,contentType和fileName参数设置正确,避免浏览器无法识别文件类型。

内容的提问来源于stack exchange,提问作者Ryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 18:14:54