Spring Boot Console said that the directory not exist when upload multipart file. Here is the repository https://github.com/hendisantika/springboot-multithreading Step to reproduce: 1. Edit pom.xml file. Change Spring Boot version into 2.6.2 2. Upload CSV file from the README.md 3. Check Spring Boot Console. It show like this:
2022-01-12 19:55:55.655 INFO 25482 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-01-12 19:55:55.655 INFO 25482 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2022-01-12 19:55:55.657 INFO 25482 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms
2022-01-12 19:55:55.777 INFO 25482 --- [ userThread-2] c.h.s.service.UserService : saving list of users of size 1001
2022-01-12 19:55:55.777 INFO 25482 --- [ userThread-1] c.h.s.service.UserService : saving list of users of size 1001
2022-01-12 19:55:56.024 INFO 25482 --- [nio-8080-exec-1] c.h.s.controller.UserController : Save 0 data
2022-01-12 19:55:56.679 INFO 25482 --- [ userThread-2] c.h.s.service.UserService : Total time 912
2022-01-12 19:55:56.687 ERROR 25482 --- [ userThread-2] c.h.s.service.UserService : Failed to parse CSV file {}
java.io.FileNotFoundException: /private/tmp/tomcat/upload_dc933398_7024_4431_a938_9e3c818a057f_00000002.tmp (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method) ~[na:na]
at java.base/java.io.FileInputStream.open(FileInputStream.java:211) ~[na:na]
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153) ~[na:na]
at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:198) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
at org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:100) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getInputStream(StandardMultipartHttpServletRequest.java:251) ~[spring-web-5.3.14.jar:5.3.14]
at com.hendisantika.springbootmultithreading.service.UserService.parseCSVFile(UserService.java:62) ~[classes/:na]
at com.hendisantika.springbootmultithreading.service.UserService.saveUsers(UserService.java:44) ~[classes/:na]
at com.hendisantika.springbootmultithreading.service.UserService$$FastClassBySpringCGLIB$$b05ab22d.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$1087/0x00000000bdd4f688.call(Unknown Source) ~[na:na]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.lambda$doSubmit$3(AsyncExecutionAspectSupport.java:276) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport$$Lambda$1088/0x00000000bdd4fa58.get(Unknown Source) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1764) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:853) ~[na:na]
2022-01-12 19:55:56.689 ERROR 25482 --- [ userThread-2] c.h.s.service.UserService : Failed to parse CSV file {}
java.io.FileNotFoundException: /private/tmp/tomcat/upload_dc933398_7024_4431_a938_9e3c818a057f_00000003.tmp (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method) ~[na:na]
at java.base/java.io.FileInputStream.open(FileInputStream.java:211) ~[na:na]
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153) ~[na:na]
at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:198) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
at org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:100) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getInputStream(StandardMultipartHttpServletRequest.java:251) ~[spring-web-5.3.14.jar:5.3.14]
at com.hendisantika.springbootmultithreading.service.UserService.parseCSVFile(UserService.java:62) ~[classes/:na]
at com.hendisantika.springbootmultithreading.service.UserService.saveUsers(UserService.java:44) ~[classes/:na]
at com.hendisantika.springbootmultithreading.service.UserService$$FastClassBySpringCGLIB$$b05ab22d.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$1087/0x00000000bdd4f688.call(Unknown Source) ~[na:na]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.lambda$doSubmit$3(AsyncExecutionAspectSupport.java:276) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport$$Lambda$1088/0x00000000bdd4fa58.get(Unknown Source) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1764) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:853) ~[na:na]
2022-01-12 19:55:56.691 ERROR 25482 --- [ userThread-2] c.h.s.service.UserService : Failed to parse CSV file {}
java.io.FileNotFoundException: /private/tmp/tomcat/upload_dc933398_7024_4431_a938_9e3c818a057f_00000004.tmp (No such file or directory)
at java.base/java.io.FileInputStream.open0(Native Method) ~[na:na]
at java.base/java.io.FileInputStream.open(FileInputStream.java:211) ~[na:na]
at java.base/java.io.FileInputStream.<init>(FileInputStream.java:153) ~[na:na]
at org.apache.tomcat.util.http.fileupload.disk.DiskFileItem.getInputStream(DiskFileItem.java:198) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
at org.apache.catalina.core.ApplicationPart.getInputStream(ApplicationPart.java:100) ~[tomcat-embed-core-9.0.56.jar:9.0.56]
at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest$StandardMultipartFile.getInputStream(StandardMultipartHttpServletRequest.java:251) ~[spring-web-5.3.14.jar:5.3.14]
at com.hendisantika.springbootmultithreading.service.UserService.parseCSVFile(UserService.java:62) ~[classes/:na]
at com.hendisantika.springbootmultithreading.service.UserService.saveUsers(UserService.java:44) ~[classes/:na]
at com.hendisantika.springbootmultithreading.service.UserService$$FastClassBySpringCGLIB$$b05ab22d.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:783) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:753) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor.lambda$invoke$0(AsyncExecutionInterceptor.java:115) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionInterceptor$$Lambda$1087/0x00000000bdd4f688.call(Unknown Source) ~[na:na]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport.lambda$doSubmit$3(AsyncExecutionAspectSupport.java:276) ~[spring-aop-5.3.14.jar:5.3.14]
at org.springframework.aop.interceptor.AsyncExecutionAspectSupport$$Lambda$1088/0x00000000bdd4fa58.get(Unknown Source) ~[na:na]
at java.base/java.util.concurrent.CompletableFuture$AsyncSupply.run(CompletableFuture.java:1764) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~[na:na]
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~[na:na]
at java.base/java.lang.Thread.run(Thread.java:853) ~[na:na]
Need help.
Thanks
Comment From: wilkinsona
As described in the javadoc for MultipartFile
, the temporary storage that's used for the file is cleared at the end of request processing. If you want to be able to work with the file beyond that point then you must use transferTo(File)
or transferTo(Path)
and then clean it up yourself once you have finished with it.
If you have any further questions, please follow up on Stack Overflow or Gitter. As mentioned in the guidelines for contributing, we prefer to use GitHub issues only for bugs and enhancements.
Comment From: hendisantika
OK. I forgot that.
Thanks