ajax下载文件

        最近做一个下载文件的工作,主要是用到了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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值