gpt4 book ai didi

Spring 启动 2.5.x : Required request part 'file' is not present

转载 作者:行者123 更新时间:2023-12-04 14:05:13 37 4
gpt4 key购买 nike

我有一个文件上传 api,它在 spring boot 下运行良好版本2.1.13 .升级版本后2.5.2 ,它开始抛出异常。查看更改日志,我看不到任何与 Multipart 相关的重大更改。加工。我会在这里错过什么?以下是我拥有的示例代码。
异常(exception)

org.springframework.web.multipart.support.MissingServletRequestPartException: Required request part 'file' is not present
at org.springframework.web.servlet.mvc.method.annotation.RequestPartMethodArgumentResolver.resolveArgument(RequestPartMethodArgumentResolver.java:161) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:170) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) ~[spring-web-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.3.8.jar:5.3.8]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.3.8.jar:5.3.8]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681) [tomcat-embed-core-9.0.48.jar:4.0.FR]
application.properties
spring.servlet.multipart.enabled=true
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB
Controller 端点
@PostMapping(
value = "/upload",
consumes = MediaType.MULTIPART_FORM_DATA_VALUE,
produces = MediaType.APPLICATION_JSON_VALUE
)
public ResponseEntity<Object> uploadFile(@RequestPart("file") MultipartFile file) {
...
}
请求有效载荷样本
POST http://localhost:8080/upload
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryGG9dgUb5THDV0eDB

------WebKitFormBoundaryGG9dgUb5THDV0eDB
Content-Disposition: form-data; name="file"; filename="Sample.pdf"
Content-Type: application/pdf

------WebKitFormBoundaryGG9dgUb5THDV0eDB--
注:我没有 MultipartResolver bean 在我的配置中定义。我尝试添加 MultipartResolver bean 定义如下(一次只添加一个),但似乎没有解决问题。
@Bean
public CommonsMultipartResolver multipartResolver() { // didn't work
return new CommonsMultipartResolver();
}

@Bean
public StandardServletMultipartResolver multipartResolver() { // didn't work
return new StandardServletMultipartResolver();
}

最佳答案

原来这个问题是在 Spring Boot 2.2 之后受到影响的。 .从那个版本开始,过滤器 HttpHiddenMethodFilter默认情况下被禁用。在 application.properties 中启用过滤器后问题得到解决.

spring.mvc.hiddenmethod.filter.enabled=true
我的详细发现
上述过滤器的目的与我得到的错误无关。但是请求 parts作为执行过滤器的副作用而被初始化。更具体地说,当过滤器尝试检索 _method 时参数值 (e.g. request.getParameter("_method") , getParameter request的方法实例内部似乎解析参数,然后初始化请求 parts .所以当过滤器在 spring-boot 中被禁用时2.2 版本,没有什么可以初始化请求 parts .
感觉像请求 parts初始化应该固定在 Spring 内框架本身。但在那之前,我们可以启用 HttpHiddenMethodFilter过滤器,或者我们可以定义一个自定义过滤器来处理初始化请求 parts ,如下所示:
@Configuration
@Order(Ordered.HIGHEST_PRECEDENCE)
public class RequestInitializerFilter extends OncePerRequestFilter {

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

request.getParameterNames(); // this takes care of initializing request `parts`

filterChain.doFilter(request, response);
}
}

关于 Spring 启动 2.5.x : Required request part 'file' is not present,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68765889/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com