我开发了一个具有微服务体系结构的系统,该系统具有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天后我无法解决问题!
答案 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”,以查看是否有帮助。