Springboot文件上传出现找不到指定系统路径的解决
springboot文件上传出现找不到指定系统路径
1、问题描述
关键字:springmvc 4.2.4、spring boot 1.3.1、servlet 3.0、文件上传
报错信息:
java.io.ioexception: java.io.filenotfoundexception: /tmp/tomcat.273391201583741210.8080/work/tomcat/localhost/root/tmp/source/img_20160129_132623.jpg (no such file or directory)
问题源码:transferto方法报错
// 前端传入mulfilesource // 创建压缩前源文件 file filesourcepath = new file("tmp/source/"); file filesource = new file(filesourcepath, mulfilesource.getoriginalfilename()); if (!filesourcepath.exists()) { filesourcepath.mkdirs(); } // 将接收得图片暂存到临时文件中 mulfilesource.transferto(filesource);
2、问题分析
首先,看源码中文件定义,相对路径,预期路径应该是项目路径/tmp/source/,但是报错确是一个系统临时文件路径(tomcat的)。
其次,由于是transferto方法报错,因此应该是该方法写入文件时报错,因此,我们跟入方法源码。
public class standardmultiparthttpservletrequest extends abstractmultiparthttpservletrequest { //中间代码省略 /** * spring multipartfile adapter, wrapping a servlet 3.0 part object. */ @suppresswarnings("serial") private static class standardmultipartfile implements multipartfile, serializable { //中间代码省略 @override public void transferto(file dest) throws ioexception, illegalstateexception { this.part.write(dest.getpath()); package org.apache.catalina.core; /** * adaptor to allow {@link fileitem} objects generated by the package renamed * commons-upload to be used by the servlet 3.0 upload api that expects * {@link part}s. */ public class applicationpart implements part { //中间代码省略 @override public void write(string filename) throws ioexception { file file = new file(filename); if (!file.isabsolute()) { file = new file(location, filename); } try { fileitem.write(file); } catch (exception e) { throw new ioexception(e); } } }
源码一目了然,使用servlet3.0的支持的上传文件功能时,如果我们没有使用绝对路径的话,transferto方法会在相对路径前添加一个location路径,即:file = new file(location, filename);。当然,这也影响了springmvc的multipartfile的使用。
由于我们创建的file在项目路径/tmp/source/,而transferto方法预期写入的文件路径为/tmp/tomcat.273391201583741210.8080/work/tomcat/localhost/root/tmp/source/,我们并没有创建该目录,因此会抛出异常。
3、问题解决方案
使用绝对路径
修改location的值
这个location可以理解为临时文件目录,我们可以通过配置location的值,使其指向我们的项目路径,这样就解决了我们遇到的问题。
在spring boot下配置location,可以在main()方法所在文件中添加如下代码:
/** * 文件上传临时路径 */ @bean multipartconfigelement multipartconfigelement() { multipartconfigfactory factory = new multipartconfigfactory(); factory.setlocation("/app/pttms/tmp"); return factory.createmultipartconfig(); }
springboot 上传文件时本地路径无效
springboot 通过网关zuul进行附件上传的时候,有时会出现如下错误
[request processing failed; nested exception is org.springframework.web.multipart.multipartexception: could not parse multipart servlet request; nested exception is java.io .ioexception: the temporary upload location [/tmp/tomcat.3814974221022613431.8080/work/tomcat/localhost/root] is not valid] with root causejava.io .ioexception: the temporary upload location [/tmp/tomcat.3814974221022613431.8080/work/tomcat/localhost/root] is not valid
错误产生的原因
1、spring boot的应用服务在启动的时候,会生成在操作系统的/tmp目录下生成一个tomcat.*的文件目录,用于"java.io.tmpdir"文件流操作
tomcatembeddedservletcontainerfactory
2、程序对文件的操作时:会生成临时文件,暂存在临时文件中;长时间不操作,导致/tmp下面的tomcat临时文件目录被删除,
且删除的文件不可恢复,上传文件时获取不到文件目录,报错
解决方式有以下几点
1.重启服务;
2.网关是否引入spring-boot-starter-web依赖,若无,则将其引入;
3、设置spring.servlet.multipart.enabled:true
4.修改上传文件默认的basedir
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径
-
使用最新版本的androidjunitrunner运行测试用例报:xxx/R.txt (系统找不到指定的文件。)的解决方法
-
android studio 迁移项目出现D:\Program\android\gradle-4.6-all.zip (系统找不到指定的路径。)的解决方法(超详细)
-
安装网卡驱动时提示 系统找不到指定文件 的解决方法
-
提示系统找不到指定文件夹的两种情况原因分析及解决
-
Springboot文件上传出现找不到指定系统路径的解决
-
IIS启动失败"系统找不到指定的路径"的解决
-
使用ImageIO.write上传二维码文件时候,提示系统找不到指定路径
-
VS 系统找不到指定的文件。解决办法,请测有效!
-
php出现系统找不到指定的路径怎么办