SpringBoot应⽤上传⽂件时报错的原因及解决⽅案
问题描述
Spring Boot应⽤(使⽤默认的嵌⼊式Tomcat)在上传⽂件时,偶尔会出现上传失败的情况,后台报错⽇志信息如下:“The temporary upload location is not valid”。
原因追踪
这个问题的根本原因是Tomcat的⽂件上传机制引起的!
Tomcat在处理⽂件上传时,会将客户端上传的⽂件写⼊临时⽬录,这个临时⽬录默认在/tmp路径下,
如:“/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT”。
⽽操作系统对于/tmp⽬录会不定时进⾏清理,如果正好因为操作系统的清理导致对应的临时⽬录被删除,客户端再上传⽂件时就会报错:“The temporary upload location is not valid”。
实际上,追踪⼀下源码会发现,如果不明确设置Tomcat的⽂件上传临时⽬录,默认读取的是Servlet上下⽂对象的属
性“t.tempdir”值,如下源码:
org.tor.Request
private void parseParts(boolean explicit) {
//...
MultipartConfigElement mce = Wrapper().getMultipartConfigElement();
//...
// 读取MultipartConfigElement对象的location属性
String locationStr = Location();
File location;
if (locationStr != null && locationStr.length() != 0) {
location = new File(locationStr);
if (!location.isAbsolute()) {
location = (new File((ServletContext().getAttribute("t.tempdir"), locationStr)).getAbsoluteFile();
}
} else {
// 如果location属性值为空,则读取Servlet上下⽂对象的属性“t.tempdir”值(如:/tmp/tomcat.6574404581312272268.18333/work/Tomcat/localhost/ROOT)    location = (ServletContext().getAttribute("t.tempdir");
}
//...
}
解决办法
既然是因为上传⽂件的临时路径被删除导致的问题,就要确保改临时⽬录不会被删除。
2种解决⽅法:
(1)通过Spring Boot的配置参数“spring.servlet.multipart.location”明确指定上传⽂件的临时⽬录,确保该路径已经存在,⽽且该⽬录不会被操作系统清除。
spring.servlet.multipart.location=/data/tmp
如上所⽰,将上传⽂件的临时⽬录指定到路径“/data/tmp”下。
实际上,在Spring Boot中关于上传⽂件的所有配置参数如下所⽰:
# MULTIPART (MultipartProperties)
spring.abled=true # Whether to enable support of multipart uploads.
spring.servlet.multipart.file-size-threshold=0B # Threshold after which files are written to disk.
spring.servlet.multipart.location= # Intermediate location of uploaded files.
spring.servlet.multipart.max-file-size=1MB # Max file size.
spring.servlet.multipart.max-request-size=10MB # Max request size.
spring.solve-lazily=false # Whether to resolve the multipart request lazily at the time of file or parameter access.
(2)在Spring容器中明确注册MultipartConfigElement对象,通过MultipartConfigFactory指定⼀个路径。
在上述源码追踪中就发现,Tomcat会使⽤MultipartConfigElement对象的location属性作为上传⽂件的临时⽬录。
/**
* 配置上传⽂件临时⽬录
* @return
*/
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
// tmp.dir参数在启动脚本中设置
String path = Property("tmp.dir");
if(path == null || "".im())) {
path = Property("user.dir");
}
String location = path + "/tmp";
File tmpFile = new File(location);
// 如果临时⽬录不存在则创建
if (!ists()) {
tmpFile.mkdirs();
}
// 明确指定上传⽂件的临时⽬录
factory.setLocation(location);
mkdirs方法ateMultipartConfig();
}
参考
以上就是Spring Boot应⽤上传⽂件时报错的原因及解决⽅案的详细内容,更多关于Spring Boot应⽤上传⽂件时报错的资料请关注其它相关⽂章!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。