欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-16 12:35:31
目录springboot文件上传出现找不到指定系统路径springboot 上传文件时本地路径无效springboot文件上传出现找不到指定系统路径1、问题描述关键字:springmvc 4.2.4、...

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

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

4.修改上传文件默认的basedir

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。