SpringBoot上传⽂件到linux服务器异常java.io.FileNotFound。。。
SpringBoot 上传⽂件到linux服务器报错java.io.FileNotFoundException: /tmp/tomcat.50898……
java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.5089835798184465073.8081/work/Tomcat/localhost/ROOT/www/server/apache-tomcat-8.5.32/webapps/jxmstory/uploadfile/201811/1541155647100.jpg (No such file or directory  at org.ApplicationPart.write(ApplicationPart.java:122)
at org.springframework.web.multipart.support.ansferTo(StandardMultipartHttpServletRequest.java:255)
at ller.admin.AttAchController.upload(AttAchController.java:226)
at ller.admin.AttAchController$$FastClassBySpringCGLIB$$15ecb206.invoke(<generated>)
at lib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:747)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:52)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
at ller.admin.AttAchController$$EnhancerBySpringCGLIB$$4003049c.upload(<generated>)
flect.NativeMethodAccessorImpl.invoke0(Native Method)
flect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
flect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at flect.Method.invoke(Method.java:498)
at org.hod.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
at org.hod.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.hod.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
at org.springframework.web.hod.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877)
at org.springframework.web.hod.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783)
at org.springframework.web.hod.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at at.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
springboot aopat org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
at org.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496)
at org.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.tor.CoyoteAdapter.service(CoyoteAdapter.java:342)
at http11.Http11Processor.service(Http11Processor.java:803)
at AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790)
at at.util.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459)
at at.util.SocketProcessorBase.run(SocketProcessorBase.java:49)
at urrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at urrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at at.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.FileNotFoundException: /tmp/tomcat.5089835798184465073.8081/work/Tomcat/l
ocalhost/ROOT/www/server/apache-tomcat-8.5.32/webapps/jxmstory/uploadfile/201811/1541155647100.jpg (No such file or directory
at java.io.FileOutputStream.open0(Native Method)
at java.io.FileOutputStream.open(FileOutputStream.java:270)
at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
at java.io.FileOutputStream.<init>(FileOutputStream.java:162)
at at.util.http.fileupload.disk.DiskFileItem.write(DiskFileItem.java:400)
at org.ApplicationPart.write(ApplicationPart.java:120)
... 71 more
报错原因:
之前上传⽂件部分代码如下
压缩上传可以普通上传在ansferTo(fie);会报错
因为上⾯创建临时⽂件的时候执⾏了ansferTo(temFile);⽅法该⽅法执⾏⼀遍后⽂件流已经关闭
//⽂件上传
//创建临时⽂件将原⽂件file放⼊临时⽂件temFile
File temFile =  ateTempFile("temp", "." + fileType);
if(temFile.length()>1024*1024*10){
//⼤于10M 压缩上传
String filedir = realDirectory+"/" + filename; // 以系统时间作为上传⽂件名称,设置上传⽂件的完整路径
AbsolutePath(), filedir);
} else {
//普通上传
File fi = new File(realDirectory);
try {
if (!fi.isDirectory()) { // 如果⽂件夹不存在就新建
fi.mkdirs();
}
File fie = new File(realDirectory, filename);
} catch (IOException e) {
e.printStackTrace();
throw BusinessException.withErrorCode(ErrorConstant.Att.UPLOAD_FILE_FAIL)
.Message());
}
}
temFile.deleteOnExit(); // 令临时⽂件在JVM关闭的时候⾃动删除
temFile.delete(); // ⽴刻删除临时⽂件
修改后的上传⽂件部分代码
@PostMapping(value = "upload")
@ResponseBody
public APIResponse upload(@RequestParam("file") MultipartFile[] files,
HttpServletRequest request,
HttpServletResponse response) throws Exception{
<span class="token comment">//⽂件存在</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>files <span class="token operator">!=</span> null<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">//遍历图⽚</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>MultipartFile file <span class="token operator">:</span> files<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token comment">//定义上传⽂件路径、⽂件名、⽂件格式</span>
java<span class="token punctuation">.</span>util<span class="token punctuation">.</span>Date Datenow<span class="token operator">=</span><span class="token keyword">new</span> <span class="token class-name">java<spa            java<span class="token punctuation">.</span>text<span class="token punctuation">.</span>SimpleDateFormat formatter <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-            String nowdate <span class="token operator">=</span> formatter<span class="token punctuation">.</span><span class="token function">format</span><span class="token punctuation">(</span>Date
now<span class="token punctua            <span class="token comment">//服务器真实路径</span>
String realDirectory <span class="token operator">=</span> WebConst<span class="token punctuation">.</span>FILE_REAL_PATH <span class="token operator">+</span> nowdate<span class="token punctuation">;</span>
<span class="token comment">//原⽂件名</span>
String fileName <span class="token operator">=</span> file<span class="token punctuation">.</span><span class="token function">getOriginalFilename</span><span class="token punctuation">(</span><span class="token punctuat            <span class="token comment">//⽂件类型</span>
String fileType<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>fileName<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>fileNam                fileType<span class="token operator">=</span><span class="token string">".jpeg"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token keyword">else</span><span class="token punctuation">{</span>
fileType <span class="token operator">=</span> fileName<span class="token punctuation">.</span><span class="token function">substring</span><span class="token punctuation">(</span>fileName<span class="token punctuatio            <span class="token punctuation">}</span>
<span class="token comment">//对⽂件进⾏重新命名</span>
String filename <span class="token operator">=</span> System<span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctua
<span class="token comment">//⽂件上传</span>
<span class="token keyword">if</span><span class="token punctuation">(</span>file<span class="token punctuation">.</span><span class="token function">getSize</span><span class="token punctuation">(</span><span class="t                <span class="token comment">//⼤于10M 压缩上传</span>
<span class="token comment">//创建临时⽂件将原⽂件file放⼊临时⽂件temFile</span>
File temFile <span class="token operator">=</span>  File<span class="token punctuation">.</span><span class="token function">createTempFile</span><span class="token punctuation">(</span><span class="token string">"tem                file<span class="token punctuation">.</span><span class="token function">transferTo</span><span class="token punctuation">(</span>temFile<span class="token punctuation">)</span><span class="token punctuation">;</span>
String filedir <span class="token operator">=</span> realDirectory<span class="token operator">+</span><span class="token string">"/"</span> <span class="token operator">+</span> filename<span class="token punctuation">;<                ImgUtill<span class="token punctuation">.</span><span class="token function">compressImage</span><span class="token punctuation">(</span>temFile<span class="token punctuation">.</span><span class="token function">ge
temFile<span class="token punctuation">.</span><span class="token function">deleteOnExit</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                temFile<span class="token punctuation">.</span><span class="token function">delete</span><span class="token
punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span            <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token comment">//普通上传</span>
File fi <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span>realDirectory<span class="token punctuation">)</sp                <span class="token keyword">try</span> <span class="token punctuation">{</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>fi<span class="token punctuation">.</span><span class="token function">isDirectory</span><span clas                        fi<span class="token punctuation">.</span><span class="token function">mkdirs</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
File fie <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">File</span><span class="token punctuation">(</span>realDirectory<span class="token punctuation">,                    file<span class="token punctuation">.</span><span class="token function">transferTo</span><span class="token punctuation">(</span>fie<span class="token punctuation">)</span><span class="token punctuation">;</span>                <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span><span class="token class-name">IOException</span> e<span class="token punctuation">)</span>                    e<span class="token punctuation">.</span><span class="token function">printStackTrace</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>                    <span class="token keyword">throw</span> BusinessException<span class="token punctuation">.</span><span class="token function">withErrorCode</span><span class="token punctuation">(</span>ErrorConstant<span class                            <span class="token punctuation">.</span><span class="token function">withErrorMessageArguments</span><span class="token punctuation">(</span>e<span class="token punctuation">.</span><span class="token func                <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> APIResponse<span class="token punctuation">.</span><span class="token function">success</span><span class="token punctuation">(</span><span class="token punctuation">)</span><    <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> APIResponse<span class="token punctuation">.</span><span class="token function">fail</span><span class="token punctuation">(</span><span class="token string">"⽂件不存在"</span>    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
这个时候普通上传依然报上⾯的错误
解决⽅法
上传路径使⽤绝对路径
修改常量类中定义的⽂件路径在 www 前加 /
//服务器真实地址(linux根⽬录需要以/开头)
public static String FILE_REAL_PATH = "/www/server/apache-tomcat-8.5.32/webapps/jxmstory/uploadfile/";
未完
</div>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。