我有一个可以上传文件的restful api,我直接使用api方法,它运行良好,但是当我使用spring cloud zuul作为代理时,我收到了关于我的restful api服务的错误信息:
[23:01:11:087] [错误] - org.apache.juli.logging.DirectJDKLog.log(DirectJDKLog.java:182) - Servlet [dispatcherServlet]的Servlet.service()与上下文路径[抛出异常[请求处理失败;嵌套异常是org.springframework.web.multipart.MultipartException:无法解析多部分servlet请求;嵌套异常是java.io.IOException:org.apache.tomcat.util.http.fileupload.FileUploadException:在插槽上读取意外的EOF] java.io.EOFException:在套接字上读取意外的EOF 在org.apache.coyote.http11.Http11InputBuffer.fill(Http11InputBuffer.java:716)~ [tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.http11.Http11InputBuffer.access $ 300(Http11InputBuffer.java:40)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.http11.Http11InputBuffer $ SocketInputBuffer.doRead(Http11InputBuffer.java:1043)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.http11.filters.IdentityInputFilter.doRead(IdentityInputFilter.java:102)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.http11.Http11InputBuffer.doRead(Http11InputBuffer.java:243)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.Request.doRead(Request.java:551)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.InputBuffer.realReadBytes(InputBuffer.java:318)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.InputBuffer.checkByteBufferEof(InputBuffer.java:611)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.InputBuffer.read(InputBuffer.java:341)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.CoyoteInputStream.read(CoyoteInputStream.java:132)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在java.io.FilterInputStream.read(FilterInputStream.java:133)〜[?:1.8.0_131] at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:132)〜[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream $ ItemInputStream.makeAvailable(MultipartStream.java:977)~ [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream $ ItemInputStream.read(MultipartStream.java:881)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在java.io.InputStream.read(InputStream.java:101)〜[?:1.8.0_131] 在org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68)〜[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream.readBodyData(MultipartStream.java:572)〜[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream.discardBodyData(MultipartStream.java:596)〜[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.MultipartStream.skipPreamble(MultipartStream.java:614)〜[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase $ FileItemIteratorImpl.findNextItem(FileUploadBase.java:865)~ [tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase $ FileItemIteratorImpl。(FileUploadBase.java:845)~ [tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.tomcat.util.http.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:256)〜[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:280)~ [tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.Request.parseParts(Request.java:2804)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.Request.parseParameters(Request.java:3148)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.Request.getParameter(Request.java:1109)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:75)〜[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)〜[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)〜[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)〜[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] 在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)〜[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:494)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:407)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)[tomcat-embed-core-9.0.7.jar:9.0.7] at org.apache.coyote.AbstractProtocol $ ConnectionHandler.process(AbstractProtocol.java:754)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1376)[tomcat-embed-core-9.0.7.jar:9.0.7] 在org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)[tomcat-embed-core-9.0.7.jar:9.0.7] 在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[?:1.8.0_131] at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[?:1.8.0_131] at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)[tomcat-embed-core-9.0.7.jar:9.0.7] 在java.lang.Thread.run(Thread.java:748)[?:1.8.0_131]
这是我的zuul代理配置:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
zuul.prefix=/appapi
zuul.host.maxTotalConnections=1000
zuul.host.maxPerRouteConnections=80
zuul.RibbonRoutingFilter.route.disable=false
zuul.FormBodyWrapperFilter.pre.disable=false
zuul.SendErrorFilter.error.disable=false
zuul.routes.userservice.stripPrefix=false
zuul.routes.userservice.path=/usersvrc/**
zuul.routes.userservice.serviceId=test-user-service
有没有人可以帮助我,我试图一遍又一遍地搜索谷歌,但我一无所知,我已经添加了一些关于多部分的配置,但它仍然不起作用,我不知道这个问题。
答案 0 :(得分:0)
上传文件的代理路径就可以工作。
对于大型文件,有一个替代路径绕过Spring DispatcherServlet(以避免多部分处理)在" / zuul / *"中。换句话说,如果你有zuul.routes.customers = / customers / **,那么你可以将大文件POST到/ zuul / customers / *。 servlet路径通过zuul.servletPath外部化。
如果代理路由引导您完成功能区负载均衡器(如果您基本上使用的是serviceID而不是url),则非常大的文件也需要提升超时设置,如以下示例所示
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000