上周工作中遇到了下载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