"Current request is not a multipart request" 的原因是什么?我该如何解决?

What causes "Current request is not a multipart request" and how do I fix it?

我正在尝试使用 Java、Spring Boot 和 Thymeleaf 开发电影应用程序,但我在上传图像时遇到问题。你能帮帮我吗?

这是控制器端。

@PostMapping("/saveMovie")
public String saveMovie(@ModelAttribute("movie")Movie movie, @RequestParam("image") MultipartFile multipartFile) throws IOException{
    String fileName = StringUtils.cleanPath(multipartFile.getOriginalFilename());
    movie.setMovieImage(fileName);
    movieService.saveMovie(movie);
    String uploadDir = "user-photos/" + movie.getId();
    FileUploadUtil.saveFile(uploadDir, fileName, multipartFile);
    return "redirect:/";
}

这是错误。

[![org.springframework.web.multipart.MultipartException: Current request is not a multipart request
    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValueInternal(RequestParamMethodArgumentResolver.java:210) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.method.annotation.RequestParamMethodArgumentResolver.handleMissingValue(RequestParamMethodArgumentResolver.java:193) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.method.annotation.AbstractNamedValueMethodArgumentResolver.resolveArgument(AbstractNamedValueMethodArgumentResolver.java:114) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1060) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:962) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~\[tomcat-embed-core-9.0.45.jar:4.0.FR\]
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~\[spring-webmvc-5.3.6.jar:5.3.6\]
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~\[tomcat-embed-core-9.0.45.jar:4.0.FR\]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~\[tomcat-embed-websocket-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~\[spring-web-5.3.6.jar:5.3.6\]
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130) ~\[na:na\]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630) ~\[na:na\]
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~\[tomcat-embed-core-9.0.45.jar:9.0.45\]
    at java.base/java.lang.Thread.run(Thread.java:831) ~\[na:na\]][1]][1]

电影添加页面。

在客户端,您应该将表单加密类型设置为 multiupart

上传文件。

当来自任何其他客户端的尝试命中时,请不要在 header 中设置任何内容类型(您的 header 应该为空)

或者您可以使用以下代码在 html 文件中指定您的 api url

<form action="your_api_url" method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
</form>

参考文献:https://github.com/postmanlabs/postman-app-support/issues/576