推荐一个性价比不错的虚拟机:/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* <p>Title: PictureController</p>* <p>Description: </p>* <p>Company: </p>* @version 1.0*/@CrossOrigin@Controllerpublic class PictureUtil {@Value("${IMAGE_SERVER_URL}")private String IMAGE_SERVER_URL;@PostMapping("/pic/upload")@ResponseBodypublic 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;//响应上传图片的urlreturn 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,手动配置临时目录,建议有项目组统一配置,便于管理和错误定位。
使用绝对路径(最简单的一种,第三种)修改location
的值
这个location
可以理解为临时文件目录,我们可以通过配置location
的值,使其指向我们的项目路径,这样就解决了我们遇到的问题。
在Spring Boot下配置location
,可以在main()
方法所在文件中添加如下代码:
@SpringBootApplicationpublic class MessageServerApplication {public static void main(String[] args) {SpringApplication.run(MessageServerApplication.class, args);}/*** 文件上传临时路径*/@BeanMultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setLocation("d://temp");return factory.createMultipartConfig();}}
经过配置后,再次上传文件,就可以直接上传了。