欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

相关标签: Ajax