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

推荐一个性价比不错的虚拟机:https://blog.csdn.net/qqtingshuo/article/details/82964537

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
 * 

Title: PictureController

*

Description:

*

Company: www.itcast.cn

* @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();
    }

}


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

 

 

你可能感兴趣的:(后台)