解决使用Spring Boot上传图片路径错误问题【入坑之一】

时间:2025-03-10 14:45:49

推荐一个性价比不错的虚拟机:/qqtingshuo/article/details/82964537

1.问题描述

  • 关键字:  Spring Boot 1.3.1 、Servlet 3.0 、文件上传
  • 报错信息:  

:The temporary upload location [C:\Users\听说\AppData\Local\Temp\tomcat.4932744338098462436.8080\work\Tomcat\localhost\ROOT] is not valid



因为是测过的代码,所以可以保证不是我本地代码异常,一定是服务器有问题,查询后确认,原来是文件上传临时上传文件夹失效了,可能是系统清除了临时目录。

 

 

2.代码(上传图片)

 

/**
 * 图片上传controller
 * <p>Title: PictureController</p>
 * <p>Description: </p>
 * <p>Company: </p>
 * @version 1.0
 */
@CrossOrigin
@Controller
public class PictureUtil {

    @Value("${IMAGE_SERVER_URL}")
    private String IMAGE_SERVER_URL;
    @PostMapping("/pic/upload")
    @ResponseBody
    public RestResponse picUpload(MultipartFile uploadFile) {
        try {
            if (uploadFile!=null){
                //接收上传的文件
                //取扩展
                String originalFilename = ();
                String extName = ((".") + 1);

                //上传到图片服务器
                FastDFSClient fastDFSClient = new FastDFSClient("");

                String url = ((), extName);
                url = IMAGE_SERVER_URL + url;

                //响应上传图片的url
                return (url);
            }else {
                return ("请选择图片");
            }
        } catch (Exception e) {
            ();
            return (e);
        }
    }
}

3.问题分析

        1、报错确是一个系统临时文件路径(tomcat的)

                如果我们没有使用绝对路径的话,transferTo方法会在相对路径前添加一个location路径,即:file = new File(location, fileName);

4.问题解决方案

    解决方案有三种
    1:重启服务,不建议在生产环境使用。
    2:增加服务配置,自定义baseDir。

 

    3:注入bean,手动配置临时目录,建议有项目组统一配置,便于管理和错误定位。

 

 

  1. 使用绝对路径(最简单的一种,第三种)
  2. 修改location的值
    这个location可以理解为临时文件目录,我们可以通过配置location的值,使其指向我们的项目路径,这样就解决了我们遇到的问题。
    在Spring Boot下配置location,可以在main()方法所在文件中添加如下代码:
@SpringBootApplication
public class MessageServerApplication {

    public static void main(String[] args) {
        (, args);
    }


    /**
     * 文件上传临时路径
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        ("d://temp");
        return ();
    }

}


经过配置后,再次上传文件,就可以直接上传了。