最近做一个下载文件的工作,主要是用到了spring+echarts,echarts有个导出图片的功能,但是在IE下无法使用,只能通过其他办法去做了,开始通过ajax,结果发现不会弹出下载框,没办法,经过查找资料,发现可以通过form表单来解决,具体如下:
imgUrl = myChart.getDataURL({ type:'png', backgroundColor:'#fff' });
先通过mychart拿到图片的二进制流,在后台通过Base64去转码,
然后通过js创建一个form表单
function downloadfile(){ var form = $("<form>"); //定义一个form表单 form.attr('style','display:none'); //在form表单中添加查询参数 form.attr('target',''); form.attr('method','post');//这里要用post,因为那个imgUrl可能会非常非常大,后台String默认是65535个字符,这个imgUrl可能会超过他N倍 form.attr('action',"自己的action方法"); var input1 = $('<input>'); input1.attr('type','hidden'); input1.attr('name','imgUrl'); input1.attr('value',imgUrl); var input2 = $('<input>'); input2.attr('type','hidden'); input2.attr('name','fileName'); input2.attr('value','我的图片.jpg'); $('body').append(form); //将表单放置在web中 form.append(input1); //将查询参数控件提交到表单上 form.append(input2); //将查询参数控件提交到表单上 form.submit(); //表单提交 }// 服务器后台逻辑后台就是通过servlet去进行处理了request.setCharacterEncoding("utf-8"); response.reset(); response.setCharacterEncoding("utf-8"); String imgUrl = request.getParameter("imgUrl"); String fileName = request.getParameter("fileName"); byte[] buffer = new BASE64Decoder().decodeBuffer(imgUrl.split(",")[1]); // 处理导出文件名乱码问题 String agent = request.getHeader("USER-AGENT"); if (null != agent && -1 != agent.indexOf("MSIE") || null != agent && -1 != agent.indexOf("Trident") || null != agent && -1 != agent.indexOf("Edge")) {// ie fileName = java.net.URLEncoder.encode(fileName+".jpg", "UTF-8"); } else if (null != agent && -1 != agent.indexOf("Mozilla")) {// 火狐,chrome等 fileName = new String((fileName+".jpg").getBytes("UTF-8"), "iso-8859-1"); } response.setHeader("Content-type","application/octet-stream"); response.setHeader("Accept-Ranges","bytes"); response.setHeader("Pragma","no-cache"); response.setHeader("Cache-Control","no-cache"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); OutputStream os = response.getOutputStream(); os.write(buffer); os.flush(); os.close();