今天遇到一个需求,利用freemarker进行word导出。一般我们都是写好word模板,然后后台查询到所需要的数据,数据+模板=输出,利用freemarker提供的api进行word导出的。我这里有点不同是,数据来自其他的库,只是页面上面可以显示并且获取到(json格式的数据)。刚开始我做测试的时候,传的json串的长度比较短,然后用ajax的get请求就可以把数据传给后台,后台servlet就可以得到数据进行导出:

$.ajax({url: c2.base("service")+"dzzzExportWordServlet?param="+jsonString,async: false,type: "GET",success: function(data){debugger;console.log(data);}
});

url:是我们工程中的写法,我们本地工程可以写成:localhost:8080/工程名/servlet访问路径

jsonString:这就是我们写死的一个短json串。

但是,当我把jsonString串的值写的比较长的时候,此时在用get请求就直接报错了。这是为什么呢?我们都知道,get请求是没有请求体的,他的参数是由长度限制的。所以这里用get请求显然不合适。于是我改成了post请求:

$.ajax({url: c2.base("service")+"dzzzExportWordServlet",async: false,type: "GET",data: {"param":jsonString},success: function(data){debugger;console.log(data);}
});

jsonString示例如下:

var dataString ="{ " +"    \"base_info\":{ " +"        \"publish_org_id\":\"5c545a228a1f446da6b14f5a0663ffdf\", " +"        \"publish_org_name\":\"省人社厅\", " +"        \"runholder\":\"zdw1-17-02\", " +"        \"ec_no\":\"3342\", " +"        \"runholder_no\":\"221133199009087788\", " +"        \"catalog_id\":\"201801100001\", " +"        \"ec_name\":\"测试111\" " +"    }, " +"    \"extend_info\":[ " +"        { " +"            \"ec_type\":0, " +"            \"json_content\":{ " +"                \"yearNum\":\"20190413001\", " +"                \"area\":\"长沙市\", " +"                \"typeCode\":\"345454523434\", " +"                \"serialNumber\":\"09001\", " +"                \"4cvbaf17-5822-4060-vftt-4rt6924b4a2\":[ " +"                    { " +"                        \"name\":\"测量标准01\", " +"                        \"type\":\"1111111\", " +"                        \"measuringRange\":\"11~11.9\", " +"                        \"measurementError\":\"0.02\", " +"                        \"number\":\"111111-01\" " +"                    }, " +"                    { " +"                        \"name\":\"测量标准02\", " +"                        \"type\":\"22222222\", " +"                        \"measuringRange\":\"12~15.9\", " +"                        \"measurementError\":\"0.03\", " +"                        \"number\":\"22222-02\" " +"                    }, " +"                    { " +"                        \"name\":\"测量标准03\", " +"                        \"type\":\"33333333\", " +"                        \"measuringRange\":\"21~31.9\", " +"                        \"measurementError\":\"0.05\", " +"                        \"number\":\"33333-03\" " +"                    } " +"                ], " +"                \"534baf17-5822-4060-cfrr-4rt692vg567\":[ " +"                    { " +"                        \"name2\":\"主要设备01\", " +"                        \"type2\":\"sb-0001\", " +"                        \"measuringRange2\":\"100~199\", " +"                        \"measurementError2\":\"0.1\", " +"                        \"number2\":\"1111222\" " +"                    }, " +"                    { " +"                        \"name2\":\"主要设备02\", " +"                        \"type2\":\"sb-0002\", " +"                        \"measuringRange2\":\"200~299\", " +"                        \"measurementError2\":\"0.2\", " +"                        \"number2\":\"3333344\" " +"                    }, " +"                    { " +"                        \"name2\":\"主要设备03\", " +"                        \"type2\":\"sb-0003\", " +"                        \"measuringRange2\":\"300~399\", " +"                        \"measurementError2\":\"0.3\", " +"                        \"number2\":\"5555566\" " +"                    } " +"                ] " +"            } " +"        }, " +"        { " +"            \"ec_type\":1, " +"            \"json_content\":{ " +"                \"test4\":\"00\", " +"                \"fhzd\":\"\", " +"                \"test0\":\"66\", " +"                \"test1\":\"77\", " +"                \"test2\":\"88\", " +"                \"test3\":\"99\" " +"            } " +"        } " +"    ] " +"}";

这时传到后台的数据是可以正常接收到的。但是这还有一个问题,当我在后台进行导出文件,提供给客户下载的时候。freemarker生成的word文件确实已经保存在了本地,但是下载的方法中,向浏览器响应时,浏览器却没有得到任何响应,后台也不报错。这又是什么原因呢?后台问了别人,他说我的请求要改成form表单提交的方式,于是前台如下:

var url = c2.base("service")+"dzzzExportWordServlet";//请求的url
var form = $('<form method="POST" action="' + url + '"></from>');//定义一个form表单,进行post请求
$.each({"param":dataString}, function(k, v) {//循环遍历,把我们的每个参数封装到一个input框中var _input=$('<input/>',{type:"hidden",name:k});//定义一个input框 type为hidden,name为k_input.val(v);//设置input框的value值为vform.append(_input);//把input框添加到form表单
});
$('body').append(form);//把form表单添加的body
form.submit();//发起提交,请求url的后台
form.remove();//移除form

果然修改成上面的请求方式后,下载就正常了。

后来我自己还搭建了一个工程测试,发现我的这个jsonString可以通过get方式传到后台不会报错,不知道项目中怎么就报错了。当然我们最好还是选择post的请求方式,数据量可以传的大,更加安全。

ajax请求后台下载文件相关推荐

  1. ajax请求无法下载文件

    原因 ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载.但用ajax仍然可以获得文件的内容,该文件 ...

  2. 前端接收pdf文件_原生ajax请求获取pdf文件流本地下载(支持谷歌IE)

    项目中要实现本地下载pdf文件,ajax请求获取到文件全路径,如上,a标签href属性赋值跳转,在iframe里面,谷歌浏览器被阻止下载.那只能另想办法.经过几天的摸索和后台调整接口数据流,终于解决. ...

  3. ajax提交用流的方式,ajax 请求 后台返回的文件流

    download(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用POST方式,根据接口 xhr. ...

  4. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

    python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...

  5. vue使用ajax提交数据,vue使用ajax请求后台数据的方法

    vue使用ajax请求后台数据的方法 发布时间:2020-10-15 16:54:41 来源:亿速云 阅读:108 作者:栢白 这篇文章主要介绍了vue使用ajax请求后台数据的方法,具有一定借鉴价值 ...

  6. jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法

    jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法 参考文章: (1)jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法 ( ...

  7. ajax使用json下拉框,ajax请求后台得到json数据后动态生成树形下拉框的方法

    如下所示: $(function(){ $.ajax({ url:"departmentAction_getAllDep.action", type:"post" ...

  8. ajax 请求成功 再执行javascript,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...

    jquery中ajax请求后台数据成功后既不执行success也不执行error,此外系统报错:Uncaught SyntaxError: Unexpected identifier at Objec ...

  9. 调用$.ajax不成功,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...

    jquery中ajax请求后台数据成功后既不执行success也不执行error,此外系统报错:Uncaught SyntaxError: Unexpected identifier at Objec ...

最新文章

  1. 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络
  2. Java之Annotation学习
  3. 神经网络与机器学习 笔记—小规模和大规模学习问题
  4. 「Python-Bug」matplotlib画图时报错Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
  5. 【转】节点预测与边预测任务实践
  6. android短信增加条目,Android仿短信条目右上角的红色小圆球提示气泡
  7. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 16丨市场分析 II【难度困难】​
  8. springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成
  9. Nginx/LVS/HAProxy负载均衡软件的优缺点详解
  10. 《干货集锦》——前端大牛 Addy Osmani 的15个精彩PPT
  11. UVALive 4487 - Exclusive-OR (加权并查集+异或运算的性质)
  12. 面积曲线AUC(area under curve)
  13. 什么是Civil3D
  14. 论文阅读《“The Boating Store Had Its Best Sail Ever”: Pronunciation-attentive ....》
  15. 电子烟市场Juul来袭,锐刻福禄们该如何做防?
  16. QQ玩一玩获取PUIN
  17. HCIA的基础知识(1)
  18. Qt Qss 渐变颜色设置
  19. C语言程序设计教程(第三版)课后习题6.7
  20. 网易视频云谈视频云的根基:云计算的介绍

热门文章

  1. 【英语:基础高阶_经典外刊阅读】L3.长句子扒皮—如何快速寻找主干
  2. 【云原生之k8s】k8s管理工具kubectl详解
  3. 全球及中国建筑设计行业十四五发展方向与投资决策建议报告2022版
  4. 【Office】Project2016 删除资源
  5. 新版蓝色UI抖音快手点赞系统源码+完整后台
  6. 深度学习环境配置避坑-CUDA11.0+DGL1.8
  7. SAP UI5 Cross Application Navigation (跨应用间跳转)的本地模拟实现试读版
  8. itchat4j -- 用Java扩展个人微信号的能力
  9. 10分钟白嫖我的常用的在线工具网站清单
  10. AD硬件电路模块设计——PS7219及单片机的SPI接口电路