文件下载时,文件名为中文和含有特殊字符的综合解决方案
先来分析这个问题:
- 文件名中含有特殊字符
- 文件名含有中文
文件名中含有特殊字符
分析:
- 含有英文逗号,导致下载链接失效
- 含有特殊符号(< > / \ | : * ? 等),导致下载到本地后无法创建文件
含有英文逗号,导致下载链接失效
解决:
- 给文件名进行encode编码
URLEncoder.encode(fileName, Charsets.UTF_8.name())
-
含有特殊符号(< > / \ | : * ? 等),导致下载到本地后无法创建文件
不同操作系统有不同的区别:- window系统:
-
windows中,文件名(包括扩展名)可高达 255 个字符。文件名可以包含除 ? / \ < > * | :
之外的大多数字符;保留文件名的大小写;文件名不区分大小写(由 POSIX 应用程序使用时除外)。
windows系统下文件名长度为:255个英文字符(DOS下8.3格式),包括文件名和扩展名在内,
或者是255/2=127个中文字符+1个英文字符。 -
具体如下:
允许文件或者文件夹名称不得超过255个字符。
文件名除了开头之外任何地方都可以使用空格。
文件名中不能有下列符号:“?”、“、”、“/”、“╲”、“*”、“<”、“>”、“|”。
Windows文件名不区分大小写,但在显示时可以保留大小写格式。
文件名中可以包含多个间隔符,如“我的文件。我的图片。001”。 -
Mac系统:
文件名中不能含有 ” : “字符,另外,文件名不能以 ‘.’ 字符开头,大小写敏感。
-
Linux系统:
允许使用除了 ‘/’ 以外 所有的特殊字符,但是不建议用户这么做。最好文件名中不要包含 : ? @ # $&()|; ‘’“”<>等字符,另外 空格符,制表符和退格符也不建议使用。
避免使用 + - 和. 作为文件名的第一个字符(Linux下以.开头的文件是隐藏文件) 。 大小写敏感。
具体解决方案:
/**
* window操作系统文件名不能含有 ? “ ”/ \ < > * | :
* mac操作系统文件名不能以.开头
* linux和Mac基本一直,
*
* @param fileName
* @return
*/
public String checkFileName(String fileName) {
Pattern pattern = Pattern.compile("[\\s\\\\/:\\*\\?\\\"<>\\|.]");
Matcher matcher = pattern.matcher(fileName);
fileName = matcher.replaceAll(""); // 将匹配到的非法字符以空替换
return fileName;
}