ajax请求后台下载文件
今天遇到一个需求,利用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请求后台下载文件相关推荐
- ajax请求无法下载文件
原因 ajax的返回值类型是json,text,html,xml类型,或者可以说ajax的接收类型只能是string字符串,不是流类型,所以无法实现文件下载.但用ajax仍然可以获得文件的内容,该文件 ...
- 前端接收pdf文件_原生ajax请求获取pdf文件流本地下载(支持谷歌IE)
项目中要实现本地下载pdf文件,ajax请求获取到文件全路径,如上,a标签href属性赋值跳转,在iframe里面,谷歌浏览器被阻止下载.那只能另想办法.经过几天的摸索和后台调整接口数据流,终于解决. ...
- ajax提交用流的方式,ajax 请求 后台返回的文件流
download(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用POST方式,根据接口 xhr. ...
- python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图
python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...
- vue使用ajax提交数据,vue使用ajax请求后台数据的方法
vue使用ajax请求后台数据的方法 发布时间:2020-10-15 16:54:41 来源:亿速云 阅读:108 作者:栢白 这篇文章主要介绍了vue使用ajax请求后台数据的方法,具有一定借鉴价值 ...
- jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法
jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法 参考文章: (1)jquery中ajax请求后台数据成功后既不执行success也不执行error解决方法 ( ...
- ajax使用json下拉框,ajax请求后台得到json数据后动态生成树形下拉框的方法
如下所示: $(function(){ $.ajax({ url:"departmentAction_getAllDep.action", type:"post" ...
- ajax 请求成功 再执行javascript,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...
jquery中ajax请求后台数据成功后既不执行success也不执行error,此外系统报错:Uncaught SyntaxError: Unexpected identifier at Objec ...
- 调用$.ajax不成功,jquery中ajax请求后台数据成功后既不执行success也不执行error的完美解决方法...
jquery中ajax请求后台数据成功后既不执行success也不执行error,此外系统报错:Uncaught SyntaxError: Unexpected identifier at Objec ...
最新文章
- 使用Ethereum C++ Aleth客户端创建具有两个同步节点的以太坊Ethereum私有网络
- Java之Annotation学习
- 神经网络与机器学习 笔记—小规模和大规模学习问题
- 「Python-Bug」matplotlib画图时报错Process finished with exit code 139 (interrupted by signal 11: SIGSEGV)
- 【转】节点预测与边预测任务实践
- android短信增加条目,Android仿短信条目右上角的红色小圆球提示气泡
- 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 16丨市场分析 II【难度困难】​
- springcloud feign 服务调用其他服务_微服务实战——SpringCloud与Feign集成
- Nginx/LVS/HAProxy负载均衡软件的优缺点详解
- 《干货集锦》——前端大牛 Addy Osmani 的15个精彩PPT
- UVALive 4487 - Exclusive-OR (加权并查集+异或运算的性质)
- 面积曲线AUC(area under curve)
- 什么是Civil3D
- 论文阅读《“The Boating Store Had Its Best Sail Ever”: Pronunciation-attentive ....》
- 电子烟市场Juul来袭,锐刻福禄们该如何做防?
- QQ玩一玩获取PUIN
- HCIA的基础知识(1)
- Qt Qss 渐变颜色设置
- C语言程序设计教程(第三版)课后习题6.7
- 网易视频云谈视频云的根基:云计算的介绍
热门文章
- 【英语:基础高阶_经典外刊阅读】L3.长句子扒皮—如何快速寻找主干
- 【云原生之k8s】k8s管理工具kubectl详解
- 全球及中国建筑设计行业十四五发展方向与投资决策建议报告2022版
- 【Office】Project2016 删除资源
- 新版蓝色UI抖音快手点赞系统源码+完整后台
- 深度学习环境配置避坑-CUDA11.0+DGL1.8
- SAP UI5 Cross Application Navigation (跨应用间跳转)的本地模拟实现试读版
- itchat4j -- 用Java扩展个人微信号的能力
- 10分钟白嫖我的常用的在线工具网站清单
- AD硬件电路模块设计——PS7219及单片机的SPI接口电路