文件上传出现找不到指定系统路径1、问题描述
关键字: 4.2.4、 Boot 1.3.1、 3.0、文件上传
报错信息:
Java.io.: java.io.n: /tmp/..8080/work///ROOT/tmp//.jpg (No such file or )
问题源码:方法报错
// 前端传入mulFileSource // 创建压缩前源文件 File fileSourcePath = new File("tmp/source/"); File fileSource = new File(fileSourcePath编程客栈, mulFileSource.getOriginalFilename()); if (!fileSourcePath.exists()) { fileSourcePath.mkdirs(); } // 将接收得图片暂存到临时文件中 mulFileSource.transferTo(fileSource);
2、问题分析
首先,看源码中文件定义,相对路径,预期路径应该是项目路径/tmp//,但是报错确是一个系统临时文件路径(的)。
其次,由于是方法报错,因此应该是该方法写入文件时报错,因此,我们跟入方法源码。
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 {python fileItem.write(file); } catch (Exception e) { throw new IOException(e); } } }
源码一目了然,使用.0的支持的上传文件功能时,如果我们没有使用绝对路径的话,方法会在相对路径前添加一个路径,即:file = new File(, );。当然,这也影响了的的使用。
由于我们创建的File在项目路径/tmp//,而方法预期写入的文件路径为/tmp/..8080/work///ROOT/tmp//,我们并没有创建该目录,因此会抛出异常。
3、问题解决方案
使用绝对路径
修改的值
这个可以理解为临时文件目录,我们可以通过配置的值,使其指向我们的项目路径,这样就解决了我们遇到的问题。
在 Boot下配置,可以在main()方法所在文件中添加如下代码:
/** * 文件上传临时路径 */ @Bean MultiandroidpartConfigElement multipartConfigElement() { MultipartConfigFactory factory = new MultipartConfigFactory(); factory.setLocation("/app/pttms/tmp"); return factory.createMultipartConfig(); }
上传文件时本地路径无效
通过网关Zuul进行附件上传的时候,有时会出现如下错误
[ ; is org..web..: Could not parse ; is java.io .: The [/tmp/..8080/work///ROOT] is not valid] with root .io .: The [/tmp/..8080/work///ROOT] is not valid
错误产生的原因
1、 boot的应用服务在启动的时候,会生成在操作系统的/tmp目录下生成一个.*的文件目录,用于”java.io.”文件流操作
TomcatEmbeddedServletContainerFactory
2、程序对文件的操作时:会生成临时文件,暂存在临时文件中;长时间不操作,导致/tmp下面的临时文件目录被删除,
且删除的文件不可恢复,上传文件时获取不到文件目录,报错
解决方式有以下几点
1.重启服务;
2.网关是否引入-boot–web依赖,若无,则将其引入;
3、设置…:true
4.修改上传文件默认的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。
本文标题: 文件上传出现找不到指定系统路径的解决