问题描述
上传文件后,获得的URL中包含了URL编码,导致在前端展示文件名时出现乱码
最终效果
解决思路:
1、先按照英文逗号切割URL
2、截取字符串中URL编码部分(含后缀名)
3、使用正则匹配截取到的字符串中的URL编码
4、转换URL编码为中文,同时拼接后缀,生成文件名,并将文件名放入List中
5、返回List给前端,前端有序展示
解决方案:
示例代码
// URL编码转换
public static void main(String[] args) {
// 原始URL字符串
String url=
"http://mail-crm.oss-cn-shenzhen.aliyuncs.com/%E6%88%90%E5%93%81%E7%BC%96%E7%A0%81%E5%88%97%E8%A1%A8%20(1)-1708652229511.zip," +
"http://mail-crm.oss-cn-shenzhen.aliyuncs.com/%E4%B9%90%E5%85%B6%E4%BB%B7%E5%80%BC%E8%A7%82%E6%A1%8C%E9%9D%A2-4-1708652279943.jpg," +
"http://mail-crm.oss-cn-shenzhen.aliyuncs.com/%E7%9A%84%E7%82%B9%E7%82%B9%E6%BB%B4%E6%BB%B4%E5%A4%9A%E5%A4%9A-1708653161697.jpg," +
"http://mail-crm.oss-cn-shenzhen.aliyuncs.com/Video_1(9)-1708653828760.mov";
// 按照英文","切割并转成list
String[] split = url.split(",");
List<String> urlStrs = Arrays.asList(split);
try {
// 这个正则表达式匹配最后一个斜杠之后的所有字符,包括文件后缀
String regex="/(%[0-9A-Fa-f]{2})+";
Pattern pattern = Pattern.compile(regex);
List<String> fileNames=new ArrayList<>();
for (int i = 0; i < urlStrs.size(); i++) {
String urlStr = urlStrs.get(i);
System.out.println("第" + (i + 1) + "次开始匹配,当前匹配URL字符串:" + urlStr);
// 使用正则表达式匹配URL编码部分和文件后缀
Matcher matcher = pattern.matcher(urlStr);
if (matcher.find()) {
// 获取匹配的整个文件名(包括编码部分和后)
String encodedFilename = matcher.group();
System.out.println("匹配的URL编码部分:" + encodedFilename);
// 解码URL编码部分
String decodedFilename = URLDecoder.decode(encodedFilename, "UTF-8");
// 获取文件后缀(最后一个点之后的部分)
int lastDotIndex = urlStr.lastIndexOf('.');
String fileExtension = (lastDotIndex > 0) ? urlStr.substring(lastDotIndex) : "";
System.out.println("当前文件名的后缀:" + fileExtension);
// 拼接解码后的文件名和文件后缀
String finalFilename = decodedFilename + fileExtension;
// 输出最终的文件名
String replaceResult = finalFilename.replaceFirst("/", "");
System.out.println("输出最终的文件名:" + replaceResult.trim());
fileNames.add(replaceResult);
} else {
// 使用lastIndexOf方法找到最后一个斜杠和最后一个点号的位置
int lastSlashIndex = urlStr.lastIndexOf('/');
// 如果找到了斜杠,则提取斜杠之后的所有内容作为文件名(包括后缀)
if (lastSlashIndex != -1) {
String filename = urlStr.substring(lastSlashIndex + 1);
// 输出处理后的文件名(包含后缀)
System.out.println("文件名(包括后缀): " + filename);
fileNames.add(filename);
}
}
}
System.out.println("fileNames:"+ JSONObject.toJSON(fileNames));
} catch (Exception e) {
System.out.println("解析异常:" + e.getMessage() + "," + e);
}
}
到此,已经解决URL编码转中文!!!
示例代码已经说的很详细了,这里不把调用代码贴出来
原创不易,望一键三连 (^ _ ^)