springboot 文件下载 文件名乱码 特殊字符乱码

1.废话不多说,直接上一段上传的代码

@GetMapping(value = "/api/file/downloadFile")
@ResponseBody
public void getUrlDownload(String url, HttpServletResponse response) {
    File file = new File(url);
    // 后缀名

    //判断文件是否存在如果不存在就进行异常处理
    if (!(file.exists() && file.canRead())) {
        System.out.println("文件不存在");
    }
    String fileName = url.substring(url.lastIndexOf(File.separator)+1);
    fileName = VisualUtils.transUrlChinese(fileName);

    try (
            FileInputStream inputStream = new FileInputStream(file);
             OutputStream stream = response.getOutputStream();
            BufferedInputStream bis = new BufferedInputStream(inputStream);
        ) {
        byte[] buffer = new byte[4096];

        //通过设置头信息给文件命名,也即是,在前端,文件流被接受完还原成原文件的时候会以你传递的文件名来命名
        response.setContentType("application/force-download");
        response.setHeader("Content-Disposition", "attachment; filename* = UTF-8''" + fileName);
        int length = bis.read(buffer);
        while (length != -1) {
            stream.write(buffer, 0, length);
            length = bis.read(buffer);
        }
        stream.flush();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
  1. 解释上面的关键点
    2.1 HttpServletResponse response 这个参数可以让浏览器选择文件保存路径,选择好路径后才开始下载,没有这个参数,点击下载就会下载到服务器指定的路径下;
    2.2 VisualUtils.transUrlChinese(fileName)是将汉字转URL编码
 public static String transUrlChinese(String str) {

    String resultURL = "";
    try {
        for (int i = 0; i < str.length(); i++) {
            char charAt = str.charAt(i);
            //只对汉字处理
            if (isChineseChar(charAt)) {
                String encode = URLEncoder.encode(charAt + "", "UTF-8");
                resultURL += encode;
            } else {
                resultURL += charAt;
            }
        }
    } catch (UnsupportedEncodingException e) {
        log.warn("解码异常!");
    }
    return resultURL;
}

private static boolean isChineseChar(char c) {
    return String.valueOf(c).matches("[\u4e00-\u9fa5]");
}

2.3 设置文件头

 response.setContentType("application/force-download");
 response.setHeader("Content-Disposition", "attachment; filename* = UTF-8''" + fileName);

特别注意 "attachment; filename* = UTF-8’’"这个设置,它可以将文件编码转为url编码,比如中文特殊字符”【、- “ 等等,但是不能把汉字转为URL编码,所以结合步骤2.2,就可以完美的解决文件名乱码问题;

2.4 一般的文件名转为URL编码的逻辑,不能处理特殊字符

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值