springboot异步文件上传获取输入流提示找不到文件java.io.FileNotFoundException

文章讲述了在SpringBoot中使用异步处理文件上传时遇到的FileNotFoundException,分析了原因在于异步方法执行前缓存文件可能已被删除。解决方法是提前打开输入流并传递给异步方法,确保异步操作完成后关闭流以释放资源。
摘要由CSDN通过智能技术生成

springboot上传文件,使用异步操作处理上传的文件数据,出现异常如下:
这个是在异步之后使用传过来的MultipartFile对象尝试调用getInputStream方法发生的异常。
java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\tomcat.8082.9218483334936865663\work\Tomcat\localhost\sdBusinessOnlineSchool\upload_43decfda_03e1_49fe_a31a_1be71b8b9a4e_00000000.tmp (系统找不到指定的文件。)
看文件的后缀是一个缓存文件,找不到缓存文件,太奇怪了。

开启bebug模式,在文件上传的时候,系统会字段在本地创建一个临时的缓存文件,在接受请求的方法内调用文件对象获取输入流,也是按照这个地址来创建输入流。
在controller层的时候:
在这里插入图片描述
进入异步方法即将执行获取输入流的时候:
在这里插入图片描述
个人想法:因为当前文件上传的业务逻辑是调用异步方法,然后直接就返回,估计接收请求的方法在返回之前,如果缓存文件没有正在被使用,框架就会将缓存文件删除。

验证:
在controller层获取输入流并且不关闭。
在这里插入图片描述

异步方法内查看:(为了防止是因为主线程执行比异步线程慢影响结果,异步方法获取之前先睡三秒。)
在这里插入图片描述
文件并没有被删除掉。验证成功。
所以想要在异步方法也能读取到上传的文件,可以在开启异步之前就打开一个输入流,然后通过传参的方式将输入流传到异步方法内。在异步方法内使用完毕再释放输入流。
提醒:记得要把输入流对象传到异步方法,并手动关闭输入流,否则会一直占用内存资源,并且服务器本地的缓存文件也无法更改或删除

异步传request,即使采用传参的方式,request内部的数据也会被清空掉。猜测和文件流被清空是同一个原理。当前线程代表当前请求,当前线程结束就清空请求头。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值