Spring Boot 上传文件,提示文件找不到的诡异现象

468 阅读1分钟

现象

在做文件上传,偶尔会报文件找不到的异常

java.io.FileNotFoundException*: /root/tomcat/cache-file/upload_05a9d1b8_bdba_4084_a466_9a4720fafa54_04033789.tmp (没有那个文件或目录)

image.png

排查问题

在网上查资料都说是因为tomcat默认保存的目录在 /tmp下面,但是我的目录是已经设置指定当前root用户下,还是报这个错误,让我没有头绪,于是继续搜索看看是否有其他情况。

直到我看到了 juejin.cn/post/687815… 这篇文章,让我恍然大悟,因为使用了异步的方式去处理文件导致的问题。

image.png

看上面的图,为了提高系统的影响速度,使用了异步线程处理文件。大概逻辑如下

1. multipartFile.getInputStream() 获取文件流 (在异步线程中)
2. 上传文件到OSS  (异步线程)

在第1步获取文件流就报错: java.io.FileNotFoundException , 因为主线程已经先结束了,结束之后主线程会把临时文件删除,这样在子线程中就无法获取文件了

解决方案

问题找到了,解决方案很简单,在步骤一multipartFile.getInputStream() 放到主线程中处理即可,获取到文件流就可以异步的处理其他逻辑了。