SpringBoot 文件下载功能 IE浏览器汉字乱码问题

问题描述:今天在实现文件下载并指定文件名称时,遇到文件下载在Google 浏览器下载正常,指定文件名称汉字未乱码,但是在IE11 浏览器上,指定文件名称汉字乱码。

问题产生原因:

  1. Chrome浏览器可以自动执行两次URL解码,所以下载的文件名是正常。
  2. IE浏览器只执行一次URL解码,所以下载的文件名是乱码

解决思路:筛选请求头信息,判别是IE浏览器还是Google 浏览器,对文件名称做对应处理

Chrome 浏览器指定文件下载名称仅重新指定编码格式="ISO-8859-1"

IE浏览器指定文件下载名称需要进行URLEncoder.encode 加码,并指定编码格式"utf-8"

 

核心功能代码:

判断浏览器是否为IE:

	/**
     * 判断是否是IE浏览器
     * 
     * @param userAgent
     * @return
     */
    public static boolean isIE(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent").toLowerCase();
        boolean isIe = false;
        if (userAgent.contains("msie") || userAgent.contains("trident") || userAgent.contains("edge")) {
        	isIe = true;
        }
        return isIe;
    }

文件下载核心功能代码:

@ApiOperation(value = "指定文件ZIP下载 ")
	@RequestMapping(value="/viewZip",  method= {RequestMethod.GET})
	public void viewZip(@RequestParam @ApiParam(name="sid", value="sid", required= true) Long sid,HttpServletResponse response) throws UnsupportedEncodingException {
		HttpServletRequest request = HttpContextUtils.getRequest();
		//TODO 根据文件所属(工程,案卷)验证权限,没有权限抛出异常.
		UserDownload download = userDownloadService.selectByPrimaryKey(sid);
		String pdfDir = null;
		
		if(download != null){
			pdfDir = transPath(download.getDownloadAddress());
			if(StringUtils.isNotEmpty(pdfDir)){
				File file = new File(pdfDir);
				response.setContentType("application/octet-stream");
				response.setHeader("Pragma", "No-cache");
				response.setHeader("Cache-Control", "no-cache");
				response.setDateHeader("Expires", 0);
				response.addHeader("Content-Length", "" + file.length());
				if(isIE(request)){
					response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", URLEncoder.encode(file.getName(), "utf-8")));  
				} else {
					response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", new String(file.getName().getBytes(),"ISO-8859-1")));  
				}


				BufferedInputStream bufferedStream = null;
				ServletOutputStream ros = null;
				try {
					// 打开指定文件的流信息
					bufferedStream = new BufferedInputStream(new FileInputStream(file));
					ros = response.getOutputStream();
					// 写出流信息
					int i;
					while ((i = bufferedStream.read()) != -1) {
						ros.write(i);
					}
					ros.flush();
				} catch (Exception e) {
					log.error("文件路径读取异常 : "+ pdfDir);
				} finally {
					IOUtils.closeQuietly(bufferedStream);
					IOUtils.closeQuietly(ros);
				}
			}else{
				log.warn("非法访问未授权文件" + JacksonUtil.toJson(securityUtils.getAuthUserDetails(request)));
			}
		}
	}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值