通过 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

我做了什么让它发挥作用。一步一步来:

  1. 为了绕过 Spring DispatcherServlet,我更改了 URL:

来自: http://localhost:8081/MyService/file

收件人: http://localhost:8081/zuul/MyService/file

  1. 保留禁用 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