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

1.问题描述

  • 关键字:  Spring Boot 1.3.1 、Servlet 3.0 、文件上传
  • 报错信息:  
java.io.IOException: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: www.itcast.cn</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 = uploadFile.getOriginalFilename();
                String extName = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);

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

                String url = fastDFSClient.uploadFile(uploadFile.getBytes(), extName);
                url = IMAGE_SERVER_URL + url;

                //响应上传图片的url
                return RestResponse.success(url);
            }else {
                return RestResponse.failure("请选择图片");
            }
        } catch (Exception e) {
            e.printStackTrace();
            return RestResponse.failure(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) {
        SpringApplication.run(MessageServerApplication.class, args);
    }


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

}

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

猜你喜欢

转载自blog.csdn.net/qqtingshuo/article/details/80720438