post请求下载excel文档解决方法
程序员文章站
2022-03-07 12:42:54
上周工作中遇到了下载excel页面无响应的情况,后台断点也没有触发,因为之前遇到过类似于这样的问题,在项目中,我们使用的是系统中已有的组件发送请求到后台的,底层使用的是get的请求方式;下载excel时候,是选中页面中的数据进行下载的,所以必须拿到每一条数据的主键Id,然后将这些主键传参到后台,选中数据量过大,而且使用的是IE浏览器(已不想吐槽);那么,首先想到的是使用post的请求方式去下载excel文档的,```sql$.ajax({ url:"url", //请求后台 da...
上周工作中遇到了下载excel页面无响应的情况,后台断点也没有触发,因为之前遇到过类似于这样的问题,在项目中,我们使用的是系统中已有的组件发送请求到后台的,底层使用的是get的请求方式;
下载excel时候,是选中页面中的数据进行下载的,所以必须拿到每一条数据的主键Id,然后将这些主键传参到后台,选中数据量过大,而且使用的是IE浏览器(已不想吐槽);
那么,首先想到的是使用post的请求方式去下载excel文档的,
```sql
$.ajax({
url:"url", //请求后台
dataType:"json",
type:"post",
data:{"system":system,"NUID":NUID},
success:function(result){
//逻辑判断代码
},
error: function(result){
//代码出现异常的逻辑
}
});
一开始,使用类似于这样的请求方式去进行下载,但是,页面无响应,后台可以正常触发;
经查阅资料发现,post请求无法直接发送请求去下载excel文档,因为我们在后台改变了响应头的内容:Content-Type:application/vnd.ms-excel,导致无法直接下载。
那么,我们最终还是要使用post方式发送请求的;
解决办法:使用form表单提交方式即可
/*============post请求下载文件
* options:{
* url:'', //下载地址
* data:{name:value}, //要发送的数据
* method:'post'
* }
*/
/**
* 解决使用post方式下载EXCEL,下载大数据量的文件
* @author lzx
* @version 2021年2月26日18:10:07
*/
var postDownLoadExcel = function (options) {
var config = $.extend(true, { method: 'post' }, options);
var $iframe = $('<iframe id="down-file-iframe" />');
var $form = $('<form target="down-file-iframe" method="' + config.method + '" />');
$form.attr('action', config.url);
for (var key in config.data) {
$form.append('<input type="hidden" name="' + key + '" value="' + config.data[key] + '" />');
}
$iframe.append($form);
$(document.body).append($iframe);
$form[0].submit();
$iframe.remove();
}
//绑定事件
$('#export').on('click', function() {
// 获取选中checkbox的长度
var allCheckedNum = SigmaUtil.getCheckedNum("checkAll", "sigma");
// 长度为1的时候表示有一个选中
if (allCheckedNum >= 1) {
confirm("是否确认导出?", function(res) {
if(res) {
var nuId = SigmaUtil.getAllCheckedIds("checkAll", "NU_ID", "sigma");
var param = {"eq_suosgs":$("#eq_suosgs").val(),"gte_danjrq":$("#gte_danjrq").val()};
postDownLoadFile({
url:"<%=webapp%>/ca0600/exportExcelX.act",
data:param,
method:'post'
});
}
});
} else {
alert("请选择至少一项");
}
});
参数直接放到param对象中就可以带到后台了,后台直接将参数的名字和前台传过来的名字对应就行。
本文地址:https://blog.csdn.net/weixin_44001753/article/details/114266453
上一篇: 2020-11-11