当 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 错误的主要内容,如果未能解决你的问题,请参考以下文章