HttpServletResponse文件下载时文件名英文字符不能解码解决办法

  1. 背景

通过HttpServletResponse下载文件时,为防止文件名乱码,因而进行utf-8编码,然而谷歌浏览器部分版本会在下载时,未对英文括号及空格类字符进行解码,则导致文件名部分未解码。

2.策略

通过正则,匹配出中文,然后对中文进行编码。也就是不对英文解码,则就不存在英文部分符号无法解码,也不会出现中文乱码。

3.代码

    //组装的完整文件名
	String fileName = fileInfo.getFileName() + "." + fileInfo.getFileType();
   //以正则匹配中文及对应字符
	Pattern pattern = Pattern
				.compile("[\u4E00-\u9FA5|\\!|\\,|\\。|\\(|\\)|\\《|\\》|\\“|\\”|\\?|\\:|\\;|\\【|\\】]+");
		Matcher matcher = pattern.matcher(fileName);
		while (matcher.find()) {
			String mStr = matcher.group();
			try {
				fileName = fileName.replaceFirst(mStr, URLEncoder.encode(mStr, "UTF-8"));
			} catch (Exception e) {

			}
		}

ps. 补充通过HttpServletResponse进行文件下载的剩余代码,可适量参考。

        //将文件转为byte数组的方法,可根据具体自行写此方法
        byte[] fileBytes = getFileBytes(filePath);
		response.reset();
		response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
		response.addHeader("Content-Length", "" + fileBytes.length);
		response.setContentType("application/octet-stream;charset=UTF-8");
		response.getOutputStream().write(fileBytes);
		response.getOutputStream().flush();
		response.getOutputStream().close();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值