推荐一个性价比不错的虚拟机:/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,手动配置临时目录,建议有项目组统一配置,便于管理和错误定位。
- 使用绝对路径(最简单的一种,第三种)
-
修改
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 ();
}
}
经过配置后,再次上传文件,就可以直接上传了。