首页 > 解决方案 > 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)

标签: javaspringspring-boot

解决方案


您遇到范围问题。

MultiPartFile 的文档说:

文件内容要么存储在内存中,要么临时存储在磁盘上。在任何一种情况下,如果需要,用户负责将文件内容复制到会话级别或持久存储。临时存储将在请求处理结束时被清除。

当您调用您的方法并且您的方法开始处理时,请求范围就消失了。您应该将文件显式复制到内存中的字符串或其他临时位置。


推荐阅读