通过 Zuul 上传大文件
Uploading large files via Zuul
我在通过 zuul 上传大文件时遇到了问题。
我正在使用 apache-commons file upload(https://commons.apache.org/proper/commons-fileupload/) 来传输大文件,我也在前面使用 zuul。
在我的 Spring 引导应用程序中,我禁用了 Spring 提供的上传功能,以使用来自 apache commons 的上传功能:
spring:
http:
multipart:
enabled: false
控制器看起来像这样:
public ResponseEntity insertFile(@PathVariable Long profileId,
HttpServletRequest request) throws Exception {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator uploadItemIterator = upload.getItemIterator(request);
if (!uploadItemIterator.hasNext()) {
throw new FileUploadException("FileItemIterator was empty");
}
while (uploadItemIterator.hasNext()) {
FileItemStream fileItemStream = uploadItemIterator.next();
if (fileItemStream.isFormField()) {
continue;
}
//do stuff
}
return new ResponseEntity(HttpStatus.OK);
}
如果我直接访问我的应用程序(没有 zuul),文件上传会按预期进行。但是,如果通过 zuul 访问它,则 FileItemIterator 没有要遍历的项目并且请求立即完成并出错(ERR_CONNECTION_RESET)。对于 zuul,我还禁用了 Spring 给出的多部分。否则,它会起作用。但是,文件不会流式传输。它们被完全加载,只有在我进入控制器后(常规 Spring 行为)。有没有办法在 zuul 中使用 apache-commons 流选项?
我找到了解决办法。
基本上在这里描述:
http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul
我做了什么让它发挥作用。一步一步来:
- 为了绕过 Spring DispatcherServlet,我更改了 URL:
来自:
http://localhost:8081/MyService/file
收件人:
http://localhost:8081/zuul/MyService/file
保留禁用 Spring 分段上传:
spring:
http:
multipart:
enabled: false
下面的header不是必须的。
Transfer-Encoding:分块
我尝试上传一个没有那个文件的大文件,但没问题。
我找到了如下所述的解决方案。
在我的例子中,要求是允许最多 30MB。在下面添加 Spring Servlet 多部分配置很有帮助,因为我注意到错误是从嵌入式 tomcat 中抛出的。请注意,请求大小应略大于 max-file-size,因为请求将包含其他参数,例如带有令牌的 headers 等。在我们的示例中,我必须为 max-request-size 添加额外的 2MB允许headers等
spring:
小服务程序:
多部分:
max-file-size:30MB
max-request-size:32MB
我在通过 zuul 上传大文件时遇到了问题。 我正在使用 apache-commons file upload(https://commons.apache.org/proper/commons-fileupload/) 来传输大文件,我也在前面使用 zuul。 在我的 Spring 引导应用程序中,我禁用了 Spring 提供的上传功能,以使用来自 apache commons 的上传功能:
spring:
http:
multipart:
enabled: false
控制器看起来像这样:
public ResponseEntity insertFile(@PathVariable Long profileId,
HttpServletRequest request) throws Exception {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator uploadItemIterator = upload.getItemIterator(request);
if (!uploadItemIterator.hasNext()) {
throw new FileUploadException("FileItemIterator was empty");
}
while (uploadItemIterator.hasNext()) {
FileItemStream fileItemStream = uploadItemIterator.next();
if (fileItemStream.isFormField()) {
continue;
}
//do stuff
}
return new ResponseEntity(HttpStatus.OK);
}
如果我直接访问我的应用程序(没有 zuul),文件上传会按预期进行。但是,如果通过 zuul 访问它,则 FileItemIterator 没有要遍历的项目并且请求立即完成并出错(ERR_CONNECTION_RESET)。对于 zuul,我还禁用了 Spring 给出的多部分。否则,它会起作用。但是,文件不会流式传输。它们被完全加载,只有在我进入控制器后(常规 Spring 行为)。有没有办法在 zuul 中使用 apache-commons 流选项?
我找到了解决办法。 基本上在这里描述:
http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul
我做了什么让它发挥作用。一步一步来:
- 为了绕过 Spring DispatcherServlet,我更改了 URL:
来自: http://localhost:8081/MyService/file
收件人: http://localhost:8081/zuul/MyService/file
保留禁用 Spring 分段上传:
spring: http: multipart: enabled: false
下面的header不是必须的。 Transfer-Encoding:分块
我尝试上传一个没有那个文件的大文件,但没问题。
我找到了如下所述的解决方案。 在我的例子中,要求是允许最多 30MB。在下面添加 Spring Servlet 多部分配置很有帮助,因为我注意到错误是从嵌入式 tomcat 中抛出的。请注意,请求大小应略大于 max-file-size,因为请求将包含其他参数,例如带有令牌的 headers 等。在我们的示例中,我必须为 max-request-size 添加额外的 2MB允许headers等
spring: 小服务程序: 多部分: max-file-size:30MB max-request-size:32MB