【Java】下载文件名空格变加号、乱码、被截断问题解决

用java写了一个下载文件的类,旨在用浏览器下载服务端文件,代码大致如下:

 

/**
	 * 文件下载
	 * @param res
	 * @param filePath
	 * @throws UnsupportedEncodingException
	 */
	public void downloadFile(HttpServletRequest req,HttpServletResponse res,String filePath) throws UnsupportedEncodingException{
		if(null == filePath || "".equals(filePath.trim())){
			return;
		}
		filePath = Util.getUTF8(filePath);
		res.setCharacterEncoding("UTF-8");
		String fileName = URLEncoder.encode(getFileName(filePath), "UTF-8");
		res.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
		OutputStream os = null;
		FileInputStream fis = null;
		try {
			os = res.getOutputStream();
			fis = new FileInputStream(filePath);
			byte[] b = new byte[100];
			int c;
			while((c=fis.read(b))>0){
				os.write(b,0,c);
			}
			os.flush();
			os.close();
		} catch (IOException e) {
			log.error(e);
			e.printStackTrace();
		}finally{
			if(null!=fis){
				try {
					fis.close();
				} catch (IOException e) {
					log.error(e);
					e.printStackTrace();
				}
			}
			if(null!=os){
				try {
					os.close();
				} catch (IOException e) {
					log.error(e);
					e.printStackTrace();
				}
			}
		}
	}

1.文件名有空格时,空格变为加号

上面的代码调试执行后,用谷歌和IE进行调试下载,内容没有问题,但却发现要下载的文件名中含有空格的时候,空格变成了加号如下图:

添加以下代码,对文件名进行空格替换即可解决:

fileName=fileName.replaceAll("\\+","%20");    //处理空格转为加号的问题

 

2.下载文件的文件名称乱码

在上面对文件名处理后,发现在谷歌和IE没有问题,而火狐浏览器出现中文乱码:

   

觉得奇怪,因为看最上面的代码块中,已经进行过UTF-8转换。但知道这是由于对文件名进行编码的问题,于是用以下方式对文件进行编码处理:

if(req.getHeader("User-Agent").toUpperCase().indexOf("MSIE")>0){
	fileName = URLEncoder.encode(getFileName(filePath), "UTF-8");
}else{
	fileName = new String((getFileName(filePath)).getBytes("UTF-8"),"ISO8859-1");
}

这样处理后,该问题得到解决,也就是我们要指定UTF-8编码的标准,各个浏览器默认的编码标准可能不大一样。

 

3.下载文件被截段

进行上面两次处理后,谷歌和IE浏览器都已正常,但发现,在火狐浏览器中,因为要下载的文件名中有空格,下载文件被截断了,导致文件后缀被去掉,文件类型无从得知,只知道为“文件”类型,如图:

作为一个严谨的程序员,还是要解决好兼容性的。将上面代码中setHeader方法中的文件名,用字符串包起来即以解决,代码改为如下:

res.setHeader("Content-Disposition", "attachment;fileName=\"" + fileName +"\"");

至此,通过对文件名字符串进行处理,下载文件名空格变加号、乱码、被截断问题都得以解决。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值