当 spring.http.multipart.enabled=false 并使用 Apache Commons File Upload 时出现“Servlet 没有多部分配置”500 错误

Posted

技术标签:

【中文标题】当 spring.http.multipart.enabled=false 并使用 Apache Commons File Upload 时出现“Servlet 没有多部分配置”500 错误【英文标题】:"No multipart config for servlet" 500 error when spring.http.multipart.enabled=false and use instead Apache Commons File Upload 【发布时间】:2020-03-16 00:24:11 【问题描述】:

我需要以流模式将大文件上传到具有 Spring Boot 和嵌入式 Jetty 的服务器。当我使用默认的 org.springframework.web.multipart.MultipartFile 时,我收到“堆空间异常”Java heap space when uploading large file to server Spring boot with embedded Jetty。

所以我尝试使用 Apache Commons File Upload 而不是 org.springframework.web.multipart.MultipartFile。

@PostMapping("import/upload")
public void importUpload(
        @RequestParam("file")
        HttpServletRequest request) throws Exception 
    ServletFileUpload upload = new ServletFileUpload();
    try (OutputStream outputStream = new FileOutputStream(zipArchive.getFile())) 
        FileItemIterator iterator = upload.getItemIterator(request);
        while (iterator.hasNext()) 
            FileItemStream item = iterator.next();
            if (!item.isFormField()) 
                InputStream inputStream = item.openStream();
                byte[] buffer = new byte[8192];
                int bytesRead;
                while ((bytesRead = inputStream.read(buffer)) > 0) 
                    outputStream.write(buffer, 0, bytesRead);
                
            
        
     catch (Exception ex) 
        throw new RuntimeException("Error: " + ex.getMessage(), ex);
    

为此,我关闭了

spring:
   http:
     multipart:
       enabled: false

在 application.yml 中

但是现在当我尝试上传文件时,我得到了

org.springframework.web.multipart.MultipartException:无法解析 多部分 servlet 请求;嵌套异常是 java.lang.IllegalStateException:servlet 没有多部分配置 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:111) 在 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:85) 在 org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:79) 在 org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 ru.factorts.module.web.filter.SessionDetaildFilter.doFilterInternal(SessionDetaildFilter.java:24) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:108) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:155) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 ru.factorts.fesb.filter.LoginFilter.doFilter(LoginFilter.java:22) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167) 在 org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:536) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1592) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1296) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1562) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1211) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:59) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 在 org.eclipse.jetty.server.Server.handle(Server.java:500) 在 org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:386) 在 org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:562) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:378) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) 在 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) 在 org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) 在 org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) 在 org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) 在 java.lang.Thread.run(Thread.java:748) 引起: java.lang.IllegalStateException:servlet 没有多部分配置 org.eclipse.jetty.server.Request.getParts(Request.java:2322) 在 org.eclipse.jetty.server.Request.getParts(Request.java:2310) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:92) ... 105 更多 java.lang.IllegalStateException: 没有多部分配置 小服务程序在 org.eclipse.jetty.server.Request.getParts(Request.java:2322) 在 org.eclipse.jetty.server.Request.getParts(Request.java:2310) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 javax.servlet.http.HttpServletRequestWrapper.getParts(HttpServletRequestWrapper.java:375) 在 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.parseRequest(StandardMultipartHttpServletRequest.java:92) 在 org.springframework.web.multipart.support.StandardMultipartHttpServletRequest.(StandardMultipartHttpServletRequest.java:85) 在 org.springframework.web.multipart.support.StandardServletMultipartResolver.resolveMultipart(StandardServletMultipartResolver.java:79) 在 org.springframework.web.multipart.support.MultipartFilter.doFilterInternal(MultipartFilter.java:112) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.boot.web.filter.ApplicationContextHeaderFilter.doFilterInternal(ApplicationContextHeaderFilter.java:55) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 ru.factorts.module.web.filter.SessionDetaildFilter.doFilterInternal(SessionDetaildFilter.java:24) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:108) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:317) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:127) 在 org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:91) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:114) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:137) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:111) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:170) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilterInternal(BasicAuthenticationFilter.java:158) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:155) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:116) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.web.filter.CorsFilter.doFilterInternal(CorsFilter.java:96) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:64) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:331) 在 org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:214) 在 org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:177) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 ru.factorts.fesb.filter.LoginFilter.doFilter(LoginFilter.java:22) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:105) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:167) 在 org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:80) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:197) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.springframework.boot.actuate.autoconfigure.MetricsFilter.doFilterInternal(MetricsFilter.java:106) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1604) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:545) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:536) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:235) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1592) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:233) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1296) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:188) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:485) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1562) 在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:186) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1211) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.HandlerList.handle(HandlerList.java:59) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) 在 org.eclipse.jetty.server.Server.handle(Server.java:500) 在 org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:386) 在 org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:562) 在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:378) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:270) 在 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) 在 org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:103) 在 org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:117) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask(EatWhatYouKill.java:336) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:313) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce(EatWhatYouKill.java:171) 在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:129) 在 org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:388) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) 在 java.lang.Thread.run(Thread.java:748)

我该如何解决这个问题?

【问题讨论】:

commons-file-upload 在 Servlet 3.0+ 环境中不兼容。不要使用它。 "我需要将一个大文件以流模式上传到一个带有 Spring boot 和嵌入式 Jetty 的服务器。" ,使用 mime/multipart 不是流模式上传。 Servlet API 中的 Multipart 行为是阻塞的,直到收到整个 multipart 声明,然后您才能阅读它。如果您想要流式传输模式,则必须在没有多部分和/或任何其他形式或基于参数的技术的情况下发送文件。 对于初学者,请从控制器中删除 @RequestParam,然后使用 HttpServletRequest。另请指定您使用的 Spring Boot 版本作为禁用文件上传的参数在版本之间发生了变化。最后,您仍然可以使用带有MultipartFile 的公共文件上传,只需添加一个名为multipartResolver 和类型为CommonsMultipartResolver 的bean。如果配置正确,它将缓存在磁盘而不是内存上。 【参考方案1】:

您是否尝试在您的 servlet 中使用 @MultipartConfig 这个符号?

@WebServlet(name = "fileUploadServlet", urlPatterns = "/upload")
@MultipartConfig(location=/tmp,
             fileSizeThreshold=0,    
             maxFileSize=5242880,       // 5 MB
             maxRequestSize=20971520)   // 20 MB
public class FileUploadServlet extends HttpServlet 

类似的东西。 Here你可以看到其他选项。

【讨论】:

据我了解,***.com/questions/32782026/… 和 baeldung.com/spring-apache-file-upload 表示法不需要 @MultipartConfig,没有它应该可以工作。我尝试添加 @RestController @RequestMapping("api/server") @MultipartConfig(fileSizeThreshold=1024*1024*10, // 10 MB maxFileSize=1024*1024*5000, // 50 MB maxRequestSize=1024*1024*10000) public class ServerCtrl implements ApplicationContextAware ,但得到同样的错误。我无法将控制器更改为 servlet ann。 我明白了。将此添加到您的请求中会改变什么? MultipartConfigElement multipartConfigElement = new MultipartConfigElement((String)null); request.setAttribute(Request.__MULTIPART_CONFIG_ELEMENT, multipartConfigElement); Jetty 版本 > 9。 还有WEB-INF/web.xml 版本的配置声明。 @LuckyMiv 减少您的fileSizeThreshold。这决定了文件被允许并完全保存在内存中的最大大小。收到的任何超过该数量的文件都会转到指定的location 中的磁盘,以便您使用更少的内存。 @LuckyMiv 这与我的建议相反。事实上,我会推荐低于 100k 的东西。

以上是关于当 spring.http.multipart.enabled=false 并使用 Apache Commons File Upload 时出现“Servlet 没有多部分配置”500 错误的主要内容,如果未能解决你的问题,请参考以下文章

更新:为啥当用户是管理员时关系有效,但当普通用户时不会?

当位于顶级栏目显示下级栏目,当位于二级栏目显示同级栏目,当位于三级目录,显示上级栏目

当应用程序在后台时扫描外围设备(例如,当屏幕锁定时)

psp一骑当千交叉冲击金手指

当组长有感

专访黄勇:Java在未来的很长一段时间仍是主流(把老板当情人,把同事当小孩,把客户当病人)