下载文件,文件名综合问题

今天遇到一个需求,客户希望以文档中一个非常重要的字段值作为下载文件名称。难点在于,这个字段的值可以是各国语言、可以包含绝大部分特殊字符(比较特殊的是逗号,因为Chrome浏览器无法下载名称中含有逗号的文件)。代码如下:

	String latin1 = "ISO-8859-1";
	if (!documentName.isEmpty()){
		documentName = documentName.replaceAll("[/\\\\:*?\"<>|]", "");
		//由于与美国客户沟通麻烦,而且这个字段几乎不可能只含有“/\\\\:*?\"<>|”,所以并没有考虑documentName变为空字符串后的默认名字。
	}
	// Latin1:Single-byte coding, to resolve Chinese scrambled code problem
	response.addHeader("Content-Disposition", "attachment; fileName=\"" + new String(documentName.getBytes(), latin1) + documentExtension + "\"");

我只测试了Chrome/FireFox, 也会有其他浏览器出问题的几率,我搜索了好多资料,并没有一个完美的解决方案。
PS:这里面还有一个大坑,哈哈哈。如果documentName.length() 大于系统规定的文件全路径名最大长度,不同浏览器的表现是不一样的。据我所知,Chrome会适当截取,而微软家的浏览器(IE,Edge)就傻掉了。
测试结果:
下载文件,文件名综合问题_第1张图片

参考资料:
How to encode the filename parameter of Content-Disposition header in HTTP?
Content-Disposition中filename字段的字符编码技巧[转]
HTTP协议header中Content-Disposition中文文件名乱码
How do I convert special UTF-8 chars to their iso-8859-1 equivalent using javascript?

你可能感兴趣的:(web前端,java)