MultipartFile上传文件临时目录自动清理机制隐患

springboot上传文件时采用MultipartFile 类型上传

    @ApiOperation("图片普通上传, adslotId 和 [ width,height ] 至少传一项, 如果同时传递了 adslotId 和 [ width,height ] ,则使用 [ width,height ] 对图片做大小限制,否则根据 adslotId 对应的资源位的尺寸对图片做大小限制 )")
    @PostMapping("images")
    public ResultEntity<Object> images(MultipartFile file , @RequestParam(required = false)Integer width, @RequestParam(required = false)Integer height, @RequestParam(required = false)Long adslotId) throws Exception {}

项目启动后会在 /tmp 文件夹下创建三个临时目录用以存储临时文件:
1, hsperfdata_root,

2,tomcat.************.8080,(结尾是项目的端口)

3,tomcat-docbase.*********.8080。

Multipart(form-data)的方式处理请求时,默认就是在第二个目录下创建临时文件的。
问题起因:
centos 会对’/tmp’下文件自动清理

当centos 系统自动清理掉临时文件夹后,会引起如下异常:

NestedServletExceprion:Request procceing failed;
nested exception is org.springframework.web.multipart.MultipartExceprion:Failed to parse multipart servelet request;
nested exception is io.IOException:upload location [/tmp/tomcat.************.8080/work/Tomcat/localhost/ROOT] is not valid

解决办法:
改变临时文件的存储路径 两种方法:

  1. 采用配置类
@Configuration
public class MultipartConfig {

    /**
     * 文件上传临时路径
     */
    @Bean
    MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        String location = "自定义临时文件路径";
        File tmpFile = new File(location);
        if (!tmpFile.exists()) {
            tmpFile.mkdirs();
        }
        factory.setLocation(location);
        return factory.createMultipartConfig();
    }
}
  1. 可采用配置文件关于multipart的配置项来指定临时文件路径
#指定multipartFile临时文件存放路径,但是内置的tomcat创建的临时文件夹路径还是不变的
spring.servlet.multipart.location=临时文件路径
#指定springboot启动时内置tomcat创建的临时文件夹的路径
#server.tomcat.basedir=/data/ops/app/cms/cache

当采用配置项后,multipartFile的临时文件如下:
debug 可以看出multipart的临时文件路径已经变成配置项的路径

你可能感兴趣的:(MultipartFile)