Java通过文件url远程下载文件(url含中文问题解决)

今天项目中需要用到url远程下载,由于url中含有文件中文名,导致下载报错,直接上代码

  /** 通过url文件地址下载
     * @param url url文件地址
     * @param filename 文件名
     * @param isOnLine true在线打开预览 ,false直接下载
     * @param response
     * @功能描述 网络文件获取到服务器后,经服务器处理后响应给前端
     */
    @ApiOperation("通过url文件地址下载")
    @ApiImplicitParams({
            @ApiImplicitParam(name="url",value="文件url",required=true,dataType="String"),
            @ApiImplicitParam(name="filename",value="生成下载的文件名",required=true,dataType="String"),
            @ApiImplicitParam(name="isOnLine",value="true在线打开预览 ,false直接下载",required=true,dataType="boolean")
    })
    @GetMapping("/netDownLoadNet")
    public void netDownLoadNet(String url, String filename, boolean isOnLine, HttpServletResponse response) throws Exception {
        //匹配中文表达式,编码替换
        String zhPattern = "[\\u4e00-\\u9fa5]";
        Pattern p = Pattern.compile(zhPattern);
        Matcher m = p.matcher(url);
        StringBuffer b = new StringBuffer();
        while (m.find()) {
            m.appendReplacement(b, URLEncoder.encode(m.group(0), "UTF-8"));
        }
        m.appendTail(b);
        URL urlHttp = new URL(b.toString());
        HttpURLConnection conn = (HttpURLConnection)urlHttp.openConnection();
        InputStream inputStream = conn.getInputStream();

        response.reset();
        response.setContentType(conn.getContentType());
        if (isOnLine) {
            // 在线打开方式 文件名应该编码成UTF-8
            response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(filename, "UTF-8"));
        } else {
            //纯下载方式 文件名应该编码成UTF-8
            response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
        }

        byte[] buffer = new byte[1024];
        int len;
        OutputStream outputStream = response.getOutputStream();
        while ((len = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.flush();
        inputStream.close();
        outputStream.close();
    }

前端请求接口后将响应数据存到一个变量中如data,在用 window.open(data)即可,。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值