Springboot文件上传出现找不到指定系统路径的解决

网友投稿 1218 2022-10-01


Springboot文件上传出现找不到指定系统路径的解决

目录Springboot文件上传出现找不到指定系统路径1、问题描述2、问题分析3、问题解决方案SpringBoot 上传文件时本地路径无效错误产生的原因解决方式有以下几点

Springboot文件上传出现找不到指定系统路径

1、问题描述

关键字:SpringMVC 4.2.4、Spring Boot 1.3.1、Servlet 3.0、文件上传

报错信息:

java.io.IOExceptiohttp://n: 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 cXSyFPUnpllass 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, fhttp://ileName);。当然,这也影响了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();

XSyFPUnpl 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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:用指纹做Windows双因素身份认证,既安全又方便
下一篇:网络安全DOS攻击是什么?主要手段有哪些?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~