java - spring boot和tomcat - 找不到文件
问题描述
我试图上传一个文件,我的服务调用了一个 spring @Async 方法并传递了一个文件对象。
fileAsyncProcessor.process(file);
在此之后,文件对象在 process 方法中变为 null
public class FileAsyncProcessor {
@Async
public void process(MultipartFile file) {
log.debug("processing file...");
InputStream is = file.getInputStream();
//.....
}
}
file.getInputStream() 返回以下错误。
ERROR c.d.f.s.util.FileAsyncProcessor - /private/var/tmp/upload_79f329ff_4cd2_46d0_b1a9_d0fac1ae27c2_00000020.tmp (No such file or directory)
java.io.FileNotFoundException: /private/var/tmp/upload_79f329ff_4cd2_46d0_b1a9_d0fac1ae27c2_00000020.tmp (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method)
at java.base/java.io.FileInputStream.open(FileInputStream.java:219)
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:194)
at org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:100)
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getInputStream(StandardMultipartHttpServletRequest.java:250)
at com.de.files.service.util.FileAsyncProcessor.processFile(FileAsyncProcessor.java:58)
解决方案
您遇到范围问题。
文件内容要么存储在内存中,要么临时存储在磁盘上。在任何一种情况下,如果需要,用户负责将文件内容复制到会话级别或持久存储。临时存储将在请求处理结束时被清除。
当您调用您的方法并且您的方法开始处理时,请求范围就消失了。您应该将文件显式复制到内存中的字符串或其他临时位置。
推荐阅读
- sql - 如何将 JSON 数组(或 JSON 数组)传递给 pg 函数以插入到表中?
- arrays - 数组索引
- variables - jsPDF GetVar 不适用于数字变量
- sqlite - SQLITE 创建表语法错误(代码 1 SQLITE_ERROR[1])
- bash - 根据 mime 类型重命名文件
- python - 加载和解析本地 JSON 文件
- sql - SQL 空间/多边形数据不正确或不一致的问题
- javascript - 为什么 ReactDOM.render 创建虚拟 DOM 后需要再次调用函数或类组件?
- drop-down-menu - 如何使下拉菜单与其他菜单项保持一致?
- kubernetes - 如何在不在 Kubernetes 的集群配置中创建死锁的情况下检查准备情况?