MultipartConfigFactory服务器默认tmp临时目录失效,如何解决这个长尾词问题?

2026-04-19 06:451阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计576个文字,预计阅读时间需要3分钟。

MultipartConfigFactory服务器默认tmp临时目录失效,如何解决这个长尾词问题?

问题:MultipartException:无法解析Multipart servlet请求;嵌套异常是java.lang.Runtime错误日志:org.springframework.web.multipart.MultipartException:无法解析Multipart servlet请求;嵌套异常是

结果:解析Multipart请求时出错,可能是Java运行时异常导致的。

问题:

MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.Runtime

错误日志:

org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: /tmp/undertow.8081.6091954911906268442/undertow2435234810596519507upload at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:124) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:115) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:88) at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:87) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1178) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1012) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

问题缘由

在 Linux 系统中,Spring Boot 应用以 java -jar 命令启动时,会在操作系统的 /tmp 目录下生成一个 tomcat(或 undertow )临时目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时 /tmp 目录下的文件,在长时间(10天)没有使用的情况下,系统执行了 tmp 目录清理服务(systemd-tmpfiles-clean.service),导致 /tmp/undertow…8090 文件被清理,然而在上传的时候,undertow 服务器需要创建/tmp/undertow…8090/undertow…upload 临时文件,但是调用 Files.createFile(…) 的时候就会发现找不到父目录,才导致了以上的错误。

解决方案

1)重启

无法一劳永逸

2)配置文件指定目录

需要在服务器手动创建文件夹

MultipartConfigFactory服务器默认tmp临时目录失效,如何解决这个长尾词问题?

mkdir -p /data/tmp

3)添加启动参数 -java.tmp.dir=/path/to/application/temp/

或者启动服务时自动创建临时目录

@Configuration public class SpringCustomizedConfig { private static final Logger log = LoggerFactory.getLogger(SpringCustomizedConfig.class); public SpringCustomizedConfig() { } @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory(); String userDirPath = System.getProperty("user.dir"); log.info("*********[SpringCustomizedConfig][multipartConfigElement] user.dir is : {}.", userDirPath); String uploadPath = userDirPath + "/multipartUpload/"; log.info("*********[SpringCustomizedConfig][multipartConfigElement] uploadPath is : {}.", uploadPath); File file = new File(uploadPath); try { if (!file.exists()) { file.mkdirs(); } } catch (Exception var6) { log.error("*********[SpringCustomizedConfig][multipartConfigElement] upload folder create failed, exception ", var6); } multipartConfigFactory.setLocation(uploadPath); return multipartConfigFactory.createMultipartConfig(); } }

本文共计576个文字,预计阅读时间需要3分钟。

MultipartConfigFactory服务器默认tmp临时目录失效,如何解决这个长尾词问题?

问题:MultipartException:无法解析Multipart servlet请求;嵌套异常是java.lang.Runtime错误日志:org.springframework.web.multipart.MultipartException:无法解析Multipart servlet请求;嵌套异常是

结果:解析Multipart请求时出错,可能是Java运行时异常导致的。

问题:

MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.Runtime

错误日志:

org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.nio.file.NoSuchFileException: /tmp/undertow.8081.6091954911906268442/undertow2435234810596519507upload at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.handleParseFailure(StandardMultipartHttpServletRequest.java:124) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:115) at org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.<init>(StandardMultipartHttpServletRequest.java:88) at org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:87) at org.springframework.web.servlet.DispatcherServlet.checkMultipart(DispatcherServlet.java:1178) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1012) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)

问题缘由

在 Linux 系统中,Spring Boot 应用以 java -jar 命令启动时,会在操作系统的 /tmp 目录下生成一个 tomcat(或 undertow )临时目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时 /tmp 目录下的文件,在长时间(10天)没有使用的情况下,系统执行了 tmp 目录清理服务(systemd-tmpfiles-clean.service),导致 /tmp/undertow…8090 文件被清理,然而在上传的时候,undertow 服务器需要创建/tmp/undertow…8090/undertow…upload 临时文件,但是调用 Files.createFile(…) 的时候就会发现找不到父目录,才导致了以上的错误。

解决方案

1)重启

无法一劳永逸

2)配置文件指定目录

需要在服务器手动创建文件夹

MultipartConfigFactory服务器默认tmp临时目录失效,如何解决这个长尾词问题?

mkdir -p /data/tmp

3)添加启动参数 -java.tmp.dir=/path/to/application/temp/

或者启动服务时自动创建临时目录

@Configuration public class SpringCustomizedConfig { private static final Logger log = LoggerFactory.getLogger(SpringCustomizedConfig.class); public SpringCustomizedConfig() { } @Bean public MultipartConfigElement multipartConfigElement() { MultipartConfigFactory multipartConfigFactory = new MultipartConfigFactory(); String userDirPath = System.getProperty("user.dir"); log.info("*********[SpringCustomizedConfig][multipartConfigElement] user.dir is : {}.", userDirPath); String uploadPath = userDirPath + "/multipartUpload/"; log.info("*********[SpringCustomizedConfig][multipartConfigElement] uploadPath is : {}.", uploadPath); File file = new File(uploadPath); try { if (!file.exists()) { file.mkdirs(); } } catch (Exception var6) { log.error("*********[SpringCustomizedConfig][multipartConfigElement] upload folder create failed, exception ", var6); } multipartConfigFactory.setLocation(uploadPath); return multipartConfigFactory.createMultipartConfig(); } }