通过Zuul上传大文件

时间:2017-07-03 13:57:12

标签: java spring spring-boot netflix-zuul apache-commons-fileupload

我遇到了通过zuul上传大文件的问题。 我正在使用apache-commons文件上传(https://commons.apache.org/proper/commons-fileupload/)来传输大文件以及我在前面使用zuul。 在我的Spring Boot应用程序中,我禁用了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流选项?

1 个答案:

答案 0 :(得分:8)

我找到了解决方案。 它基本上在这里描述:

http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_uploading_files_through_zuul

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

  1. 要绕过Spring DispatcherServlet,我更改了URL:
  2. 自: http://localhost:8081/MyService/file

    要: http://localhost:8081/zuul/MyService/file

    1. 保留禁用Spring分段上传:

      spring:
          http:
              multipart:
                  enabled: false
      
    2. 不需要以下标题。 Transfer-Encoding:chunked

      我尝试上传没有那个的大文件,这很好。