Ajax异步请求下载文件,window.location.href 存在一次点击下载两个相同文件的问题

Ajax异步请求下载文件

背景:
  • 页面点击“下载”按钮 下载图片
  • window.location.href= ‘url’ 存在一次点击下载两个相同图片的问题(本次就死在这~~~~)
  • 后端将图片已处理为流
    废话不多说,看代码
前端JS 
  window.downloadImage=function(date){
            //window.location.href='./model/download?url='+date; 这样的方式 不行~
            layer.load();
            var url ='后端下载的Url'
            var xhr = new XMLHttpRequest();
            xhr.open('GET', url, true);    // 也可以使用POST方式,根据接口
            xhr.responseType = "blob";  // 返回类型blob
            // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
            xhr.onload = function () {
                // 请求完成
                if (this.status === 200) {
                    // 返回200
                    var blob = this.response;
                    var reader = new FileReader();
                    reader.readAsDataURL(blob);  // 转换为base64,可以直接放入a表情href
                    reader.onload = function (e) {
                        // 转换完成,创建一个a标签用于下载
                        var a = document.createElement('a');
                        a.download = loginUserName+'.jpg';//下载后的文件名
                        a.href = e.target.result;
                        $("body").append(a);  // 修复firefox中无法触发click
                        a.click();
                        $(a).remove();
                        layer.closeAll('loading');
                    }
                }
                layer.closeAll();
            };
            // 发送ajax请求
            xhr.send()
        }
后端代码质量不咋地, 功能是好的, 将就着看哈~ 
/***
     * 下载生成的海报
     * @param url 图床上海报的url
     * @param response 响应
     */
    @ResponseBody
    @RequestMapping("/download")
    public void download(String url,HttpServletResponse response,HttpSession session){
        InputStream inputStream=null;
        OutputStream outputStream=null;
        String  attribute = String.valueOf(session.getAttribute(SessionConst.USER));
        if(StringUtils.isNotEmpty(url)){
        try {
            URL url1 = new URL(url);
            URLConnection con = url1.openConnection();
            //设置请求超时为5s
            con.setConnectTimeout(5*1000);
            // 输入流
            inputStream = con.getInputStream();
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/octet-stream;charset=UTF-8");
            response.setHeader("Content-disposition", "attachment;fileName=" +
                    URLEncoder.encode(""+attribute+".jpg", "UTF-8"));
             outputStream = response.getOutputStream();
            IOUtils.copy(inputStream, outputStream);
            outputStream.flush();
        } catch (MalformedURLException e) {
            LOG.error("MalformedURLException error",e);
        } catch (IOException e) {
            LOG.error("IOException" ,e);
        }finally {
            if(null!=outputStream){
                try {
                    outputStream.close();
                } catch (IOException e) {
                    LOG.error("outputStream.close() error",e);
                }
            }
            if(null!=inputStream){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    LOG.error("is.close() error",e);
                }
            }
        }

        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值