#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 говорится:
Содержимое файла либо сохраняется в памяти, либо временно на диске. В любом случае пользователь несет ответственность за копирование содержимого файла в сеансовый уровень или постоянное хранилище по желанию. Временное хранилище будет очищено в конце обработки запроса.
Когда вы вызываете свой метод и ваш метод начинает обработку, область запроса исчезает. Вы должны явно скопировать файл в строку в памяти или другое временное местоположение.