Spring ServletFileUpload迭代器返回空列表

时间:2019-05-20 12:25:40

标签: java spring spring-boot ribbon netflix-zuul

我开发了一个具有微服务体系结构的系统,该系统具有spring boot(1.5.9)框架,在网关模式中使用zuul和功能区。 为了上传大文件,我禁用了分段上传,如下所示:

application.yml
spring:
  http:
    multipart:
      enabled: false
      max-request-size: -1
      max-file-size: -1

据我所知,由于阻止了spring处理多部分请求,因此应禁用spring多部分请求解析器。
在下一步中,我增加了功能区超时和zuul超时:

gateway.yml
ribbon: #LoadBalancer
  ReadTimeout: 20000
  ConnectTimeout: 20000
zuul: #Gatway Proxy
  ignoredServices: '*'
  set-content-length: true
  #prefix: /api
  host:
    connect-timeout-millis: 20000
    socket-timeout-millis: 20000

上载代码如下:

DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
factory.setSizeThreshold(0);
factory.setFileCleaningTracker(null);

//Create a new file upload handler
ServletFileUpload uploader = new ServletFileUpload(new DiskFileItemFactory());

//Parse the request
FileItemIterator iter = uploader.getItemIterator(httpServletRequest);
while (iter.hasNext())
 {
 ...
 }

我使用下面的URL来上传文件:

example.com/zuul/serviceName/upload

如spring文档中所述,我们需要在URL中添加zuul前缀以绕过zuul过滤器,而我做到了。
但这仅适用于小文件。当我尝试上传大文件时,FileItemIterator为空iterator

我测试了所有内容,经过2天后我无法解决问题!

1 个答案:

答案 0 :(得分:0)

摘自官方文档-

  

通过Zuul上传文件-

     

如果使用@EnableZuulProxy,则可以使用代理路径上传   文件,只要文件很小,它就可以工作。对于大   文件中有一个替代路径绕过Spring   “ / zuul / *”中的DispatcherServlet(以避免进行多部分处理)。在   换句话说,如果您有zuul.routes.customers = / customers / **,那么您   可以将大文件发布到/ zuul / customers / *。 servlet路径是   通过zuul.servletPath外部化。如果代理路由带您   通过功能区负载平衡器,还需要很大的文件   提升的超时设置,如以下示例所示:

application.yml

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 60000
ribbon:
ConnectTimeout: 3000
ReadTimeout: 60000
  

请注意,要使用流技术处理大型文件,您需要使用   请求中的分块编码(某些浏览器不这样做   默认值),如以下示例所示:

$ curl -v -H "Transfer-Encoding: chunked" \
-F "file=@mylarge.iso" localhost:9999/zuul/simple/file

对于大文件(10M或更多),必须将/ zuul前缀添加到上传路径。您还可以使用zuul.servlet-path自定义前缀。

假设zuul.routes.microservice-file-upload = / microservice-file-upload / **

您可以尝试绕过Spring DispatcherServlet并按预期使用Zuul。如果http:// {host}:{port} / upload是文件上传的路径,则可以使用Zuul的http://yourhost:port/zuul/your-service/upload路径来上传大文件。

此外,您是否可以忽略以下标头“ Transfer-Encoding:chunked”,以查看是否有帮助。