使用MultipartFile做文件上传报FileNotFoundException问题总结

--------------------------------------使用MultipartFile做文件上传报FileNotFoundException问题总结--------------------------------------
public String upload(@RequestParam("file") MultipartFile multipartFile)
问题:使用spring的MultipartFile做文件上传操作时,报java.io.IOException: java.io.FileNotFoundException: /tmp/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/IMG_20160129_132623.jpg (No such file or directory)
原因:当使用MultipartFile做上传操作时,
      1:spring是先将上传文件存放在一个临时地址,默认/tmp目录下
      2:进入controller进行业务操作
      linux环境中/tmp目录是存放临时文件的,当这个目录下的子目录10天之内,没有使用过,linux就会将目录删掉,然后上传文件时就会在第一步发生异常


修改方式:第一种方式:将linux下的存放应用的临时文件的那个子目录,非/tmp目录,设置为不删除 tmpwatch命令

         第二种方式:设置MultipartConfig的location,将临时文件的存放地址,改为非/tmp目录

                             

@Bean
MultipartConfigElement multipartConfigElement() {
    MultipartConfigFactory factory = new MultipartConfigFactory();
    factory.setLocation("d://123/");
    return factory.createMultipartConfig();
}

         第三种方式:修改tomcat的临时文件存放目录,spring boot中使用server.tomcat.basedir=d://file/参数配置

server.tomcat.basedir=d://123/

相关源码:
--->org.apache.catalina.connector.Request#parseParts
------>MultipartConfigElement mce = this.getWrapper().getMultipartConfigElement()获取MultipartConfig,没有自定义配置时,取默认
mce = {MultipartConfigElement@6283} 
location = ""
  value = {char[0]@6329} 
  hash = 0
maxFileSize = 1048576
maxRequestSize = 10485760
fileSizeThreshold = 0


------> String locationStr = mce.getLocation();
                File location;
                if (locationStr != null && locationStr.length() != 0) {
                    location = new File(locationStr);
                    if (!location.isAbsolute()) {
                        location = (new File((File)context.getServletContext().getAttribute("javax.servlet.context.tempdir"), locationStr)).getAbsoluteFile();
                    }
                } else {
                    //当没有配置MultipartConfig存放文件的存放目录时,存放在下面获取到的目录(spring boot的临时文件存放目录)下,spring boot启动时会生成一个下面参数对应的路径
                    location = (File)context.getServletContext().getAttribute("javax.servlet.context.tempdir");
                }
--->org.apache.tomcat.util.http.fileupload.DeferredFileOutputStream#thresholdReached
------>this.memoryOutputStream.writeTo(fos);//保存临时文件的方法

你可能感兴趣的:(spring)