我尝试上传文件,并且我的服务调用spring @Async方法并传递文件对象。
fileAsyncProcessor.process(file);
此后,文件对象在处理方法中将变为空
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)
答案 0 :(得分:1)
您遇到示波器问题。
The documentation of MultiPartFile说:
文件内容要么存储在内存中,要么临时存储在磁盘上。 无论哪种情况,用户都有责任将文件内容复制到 会话级别或持久性存储(如果需要)。临时的 在请求处理结束时将清除存储。
当您调用方法并且方法开始处理时,请求范围已消失。您应该将文件显式复制到内存中的字符串或其他临时位置。