весенняя загрузка и tomcat — файл не найдены

#java #spring #spring-boot

#java #весна #весенняя загрузка

Вопрос:

Я попытался загрузить файл, и моя служба вызывает метод spring @ Async и передает файловый объект.

 fileAsyncProcessor.process(file);
  

После этого файловый объект становится нулевым в методе process

     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. Файл должен находиться в корневом каталоге вашего проекта.

2. Проверьте путь к вашему файлу, file.getInputStream() попробуйте получить файл в «/ private/var/tmp /» Я думаю, что это должен быть root типа «/var/ tmp /» без «private»

3. Я вижу эту проблему только для сервера tomcat. Когда я использовал Jetty, я не мог воспроизвести это.

4. <зависимость> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <исключения> <исключение> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </исключение> </исключения> </dependency> <зависимость> <groupId>org. springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </зависимость>

Ответ №1:

У вас проблема с областью видимости.

В документации MultipartFile говорится:

Содержимое файла либо сохраняется в памяти, либо временно на диске. В любом случае пользователь несет ответственность за копирование содержимого файла в сеансовый уровень или постоянное хранилище по желанию. Временное хранилище будет очищено в конце обработки запроса.

Когда вы вызываете свой метод и ваш метод начинает обработку, область запроса исчезает. Вы должны явно скопировать файл в строку в памяти или другое временное местоположение.