java获取下载文件_Java获取HTTP下载文件文件名称
注意中间有段去符号的代码,这段代码只适合Java11默认HttpClient使用。
/**
获取文件名称
下载文件名称:如果不存在返回默认的文件名称
Content-Disposition:attachment;filename=snail.jar?version=1.0.0
Content-Disposition:attachment;filename="snail.jar"
- @param defaultName 默认文件名称
*/
public String fileName(final String defaultName) {
String fileName = header(CONTENT_DISPOSITION);
if(StringUtils.isEmpty(fileName)) {
return defaultName;
}
final String fileNameLower = fileName.toLowerCase();
if(fileNameLower.contains(FILENAME)) { // 包含文件名称
fileName = UrlUtils.decode(fileName); // URL解码
int index = fileName.indexOf("=");
if(index != -1) {
// 截取名称
fileName = fileName.substring(index + 1);
// 去掉引号
if(fileName.startsWith(""") && fileName.endsWith(""")) {
fileName = fileName.substring(1, fileName.length() - 1);
}
// 去掉参数
index = fileName.indexOf("?");
if(index != -1) {
fileName = fileName.substring(0, index);
}
}
fileName = fileName.trim();
if(StringUtils.isEmpty(fileName)) {
return defaultName;
}
该编码器将按照SystemConfig.CHARSET_GBK进行配置。
// 只是进行URL编码
if(encoder.canEncode(fileName)) {
return fileName;
}
// HttpClient工具汉字ISO-8859-1字符转为char没有去掉符号(& 0xFF)
final char[] chars = fileName.toCharArray();
for (int i = 0; i < chars.length; i++) {
// 去掉符号
chars[i] = (char) (chars[i] & 0x00FF);
}
fileName = new String(chars);
// 处理ISO-8859-1编码
// GBK
最终字符串fileNameGBK被赋值为SystemConfig.CHARSET_ISO_8859_1和SystemConfig.CHARSET_GBK共同作用下的结果。
该过程通过调用StringUtils中的charset方法生成指定字符集的字符串。
具体而言,在参数fileName的基础上分别设置相应的字符集生成新的GBK编码字符串。
通过这一操作可以确保文件编码格式符合GBK标准的要求。
// UTF-8
static final 字符串 fileNameUTF8 = StringUtils::charset(文件名 UTF-8 编码, 系统配置中的 ISO-8859-1 编码设置);
/*
判断依据
GBK转为UTF8基本乱码
转换时可能会出现乱码;但这些字符可能不属于GBK编码体系内的字符;同时也可以被视为GBK编码体系中的某些特定字符。
*/
if(encoder.canEncode(fileNameUTF8)) {
return fileNameUTF8;
}
if(encoder.canEncode(fileNameGBK)) {
return fileNameGBK;
}
// 其他编码直接返回
return fileName;
} else {
return defaultName;
}
}
