由于项目中涉及到上传文件夹的功能,但是一般SpringBoot并不支持上传整个文件夹因为HTTP协议本身是为传输单个文件而设计的,而不是整个目录结构。所以最终选用的是通过打包成zip等压缩文件以后再进行上传,这时候单纯的上传文件就变成了需要先解压再保存文件两个步骤了,刚开始我的注意力一直集中在回显的代码问题上,在file.getName()读取文件上使用了多种编码方式都无济于事,比如下面的代码,我感觉已经很靠谱了,但是在某些极端情况下,比如有空格情况下,依然还是有部分乱码的情况
TreeNode node; try { node = new TreeNode(new String(file.getName().getBytes("GBK"), StandardCharsets.UTF_8), file.getAbsolutePath()); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } nodes.add(node);
经过仔细思考才发现问题根源不在读取文件上,应该是出在保存文件上,带着疑问打开了上传文件目录,才发现上传上去的文件名称中文本身就是乱码!也就是说是上传的过程有问题,而不是读取文件回显的过程有问题!往往一件事情有问题,排查问题的过程是比较难的,解决问题往往很简单,就比如保存文件中文名称乱码的问题,既然定位到了上传这一步骤,立马就锁定了肯定是出在「解压文件」这个环节,因为当时的解压缩文件方法是从网上直接复制的工具类,没仔细梳理代码,打开解压方法果然发现问题,出问题的代码如下:
public static void unPackZip(File zipFile, String password, String destPath) { try { ZipFile zip = new ZipFile(zipFile); /*zip4j默认用GBK编码去解压,这里设置编码为GBK的*/ zip.setFileNameCharset("GBK"); logger.info("begin unpack zip file...."); zip.extractAll(destPath); // 如果解压需要密码 if (password != null) { if (zip.isEncrypted()) { zip.setPassword(password); } } } catch (Exception e) { logger.error("解压失败:", e.getMessage(), e); } }
看到了吗?第 4 行,上面还注释了,真扯淡!这里一定要改为zip.setFileNameCharset("UTF-8");要不中文的文件名肯定乱码,最后如果你先前也在回显文件中动过手脚一定记得恢复代码,我这边回显代码最终恢复如下,问题解决!
TreeNode node = new TreeNode(file.getName(), file.getAbsolutePath()); nodes.add(node);
总结
通过这个事件让我懂得了遇到问题一定要全面分析,不能只局限于一点,一面。再者就是要对网上查到的信息保持怀疑态度,多一点时间确认代码,就少一分问题的出现。共勉!如果有想快速建设企业或者博客网站的,不妨关注下我们的diy自助建站平台,基于Java语言SpringBoot框架实现的建站系统,有更高的安全性、稳定性以及超高性能,而且价格优惠,百元建站,万元品质保障!如果有高端响应式(Bootstrap、TailwindCSS)建站网站模板或者各类建站素材的需求也可以关注我们的资源频道。