春季启动和tomcat-找不到文件

时间:2019-03-19 05:05:22

标签: java spring spring-boot

我尝试上传文件,并且我的服务调用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)

1 个答案:

答案 0 :(得分:1)

您遇到示波器问题。

The documentation of MultiPartFile说:

  

文件内容要么存储在内存中,要么临时存储在磁盘上。   无论哪种情况,用户都有责任将文件内容复制到   会话级别或持久性存储(如果需要)。临时的   在请求处理结束时将清除存储。

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