通过Zuul上传大文件

dve*_*opp 7 java spring apache-commons-fileupload spring-boot netflix-zuul

我在通过zuul上传大文件时遇到了问题.我正在使用apache-commons文件上传(https://commons.apache.org/proper/commons-fileupload/)来传输大文件以及我在前面使用zuul.在我的Spring Boot应用程序中,我禁用了Spring提供的上传来使用apache commons中的一个:

  spring:
      http:
          multipart:
              enabled: false
Run Code Online (Sandbox Code Playgroud)

控制器看起来像这样:

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);
} 
Run Code Online (Sandbox Code Playgroud)

如果我直接访问我的应用程序(没有zuul),文件上传按预期工作.但是,如果通过zuul访问它,则FileItemIterator没有要遍历的项目,并且请求立即生成错误(ERR_CONNECTION_RESET).对于zuul,我也禁用了Spring给出的多部分.否则,它的工作原理.但是,文件未流式传输.只有在我进入控制器(常规的Spring行为)之后才会完全加载它们.有没有办法在zuul中使用apache-commons流选项?

dve*_*opp 9

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

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
    
    Run Code Online (Sandbox Code Playgroud)

不需要以下标头.转移编码:分块

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