SpringBoot项目打包部署时使用transferTo方法遇到的文件上传问题

229 阅读1分钟

版本:

  • SpringBoot:3.4.0

项目里有一个文件上传功能,路径没有问题,对应的目录也早就创建好了,但却出现了文件没找到的错误。

错误截图

image.png

错误原因分析

1. 定位错误

image.png 从错误类型来看,这个错误发生的原因是因为没找到文件,反映到代码上来看就是因为使用transferTo方法保存文件时路径存在问题。排查问题时又测试了另一个接口。代码如下: image.png 结果这个接口就能正常上传,后来我又在图1那打印了文件路径,发现路径没有问题。从结果上来看就是transferTo方法的原因,但是为什么呢?

2. 解决错误

我向AI提出了这个疑问,结合AI的回答我锁定到一个可能的原因:使用相对路径。然后我把代码修改如下图:

image.png 经过测试,问题被成功解决。

总结错误原因

我不知道发生这个错误的具体原因是什么,但我结合AI的答案和自己的理解给出以下猜测:

transferTo方法来自SpringBoot,而SpringBoot又默认使用Tomcat作为服务器,这也是为什么上面的错误路径会有tomcat的原因。而上面错误路径其实是tomcat用来存储临时文件的目录。当transferTo方法接收到的是一个相当路径时就会默认把文件保存到tomcat的临时目录里,又因为临时目录里没有找到提供的目录,所以就抛出FileNotFoundException。所以解决方法就是给transferTo方法提供绝对路径。