一尘不染

通过Zuul上传大文件

spring-boot

我在通过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提供的multipart。否则,它将起作用。但是,不会流式传输文件。它们只有在我进入控制器后才被完全加载(常规的Spring行为)。有没有办法在zuul中使用apache-
commons流选项?


阅读 883

收藏
2020-05-30

共1个答案

一尘不染

我找到了解决方案。基本描述如下:

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
    

以下标头不是必需的。传输编码:分块

我试图上传一个没有该文件的大文件,这很好。

2020-05-30