无法覆盖 UAT 配置文件环境中的 Tomcat 默认文件大小限制

Posted

技术标签:

【中文标题】无法覆盖 UAT 配置文件环境中的 Tomcat 默认文件大小限制【英文标题】:Can't override Tomcat default file size limit in UAT profile environment 【发布时间】:2021-10-24 14:38:49 【问题描述】:

由于某种原因,在使用 UAT 配置文件环境时,我无法覆盖 Tomcat 关于文件大小限制的设置(在 SIT 上一切正常)

我正在使用 Spring Boot 2.2,并将这些属性添加到配置文件中:

spring.servlet.multipart.max-file-size=25MB
spring.servlet.multipart.max-request-size=25MB

但是,当我在 Eclipse IDE(全新安装和配置文件 UAT)上运行我的应用程序时,当我尝试上传大于 1MB 的文件(AFAIK 是 Tomcat 的默认文件限制大小)时,它给了我错误。

还有几点需要指出:

    application-sit.properties 文件和 application-uat.properties 的所有指令都以相同的顺序排列。 当我尝试上传大小小于 1MB 的文件时,我收到另一个错误,即 UnsupportedMediaType,因此我想知道问题出在我的 Angular 前端还是 Spring Boot 后端应用程序中。

哦...我在本地运行我的 SIT 应用程序,而 UAT 应用程序在 VM 中运行(如果它与 VM 有关,我不会感到惊讶)。

提前感谢大家的帮助,如果您需要更多信息,我很乐意回答。

祝你有美好的一天。

更新

根据 @PiotrP.Karwasz 的要求,我包含了我用来制作上传服务的 Angular 和 Spring 代码:

upload() in upload-service.service.ts

  upload(file: File)  
    const formData: FormData = new FormData();
    formData.append('file', file);

    return new Observable(((observer: Observer<any>) => 
      const xhr = new XMLHttpRequest();

      xhr.onreadystatechange = _ => 
        if (xhr.readyState === 4) 
          if(xhr.status === 200) 
            observer.next(xhr.response);
            observer.complete();
          
          else 
            observer.error(xhr.response); 
          
         
      ;

      ///environment.baseUrl changes based on the active profile config
      let url = environment.baseUrl + constants.REST_UPLOAD_FILE; 
      xhr.open('POST', url, true);
      xhr.send(formData);
    ));
  

save() in FileStorageService.java

@Override
public void save(MultipartFile file) 
    try 
        String filename = FilenameUtils.removeExtension(file.getOriginalFilename()) 
                                        + " - " 
                                        +  new SimpleDateFormat("dd꞉MM꞉yyyy HH'h'꞉mm'min'꞉ss's'")
                                            .format(new Date())
                                            .toString()
                                            .replaceAll("[^a-zA-Z0-9.-⁄꞉]", "_") 
                                        + "." + FilenameUtils.getExtension(file.getOriginalFilename());
        
        Files.copy(file.getInputStream(), this.root.resolve(filename));
     catch (final Exception e) 
        throw new RuntimeException("Non posso salvare il file. Errore: " + e);
    

请注意,据我所知,通过在 Eclipse 控制台上进行打印测试,似乎它甚至还没有达到 Spring Boot save() 方法的地步,我实际上也尝试过在管理传入请求的控制器方法(其代码将在下面链接),但无论哪种方式它都没有显示任何内容,因此看起来更像是它永远不会到达控制器。

处理上传请求的控制器方法可在https://pastebin.com/EMZStXJw获得

【问题讨论】:

如何上传文件:是通过 html 表单吗?你在用什么enctypemultipart/form-data 还是默认的application/x-www-form-urlencoded? @PiotrP.Karwasz 我正在使用 Angular FormData 上传带有拖放区域的文件,您可以在此处查看 HTML 代码:pastebin.com/i83TV0CA 这是相关组件:pastebin.com/H0Xbhnpw 另外,如果它可能会有所帮助,我的 Angular 代码基于本指南(我刚刚进行了一些更改以实现拖放并使用 XMLHttpRequest 而不是通常的 HttpClient 来发出请求,因为它给了我模棱两可的跨源问题):@ 987654324@ 这涵盖了接口,但是uploadService.upload 是如何实现的以及Spring 方面的处理程序方法呢?您可以将它们添加到您的问题中吗? @PiotrP.Karwasz 首先感谢您尝试帮助我,我正在工作几天只是为了解决这个问题。我已按照您的要求更新了我的问题。因为当我向控制器方法发出请求时它不会在屏幕上打印东西,但它给了我与文件大小或媒体类型相关的特定例外情况,我现在最好的猜测是,当我部署 .war 应用程序时,它会遗漏一些东西.我也尝试使用 Postman 向正确的 URL 发出请求,但结果相同。 您发布的代码应该可以工作:如果 XHR 请求的 Content-Typemultipart/form-data,请检查您的浏览器调试工具。您的浏览器和 Tomcat 之间是否有任何代理可能会更改 Content-Type 【参考方案1】:

好的,在提取了我的前端构建的.war 文件后,我终于得到了它,我会把它放在这里给任何可能需要它的人。

问题是我的environment.baseUrl(参见upload-service.service.ts 文件中的upload() 方法)指向一个无效 端点(我仍然需要弄清楚为什么端点的行为像那以及为什么它首先存在)所以当我尝试提出请求时,我得到了与实际无关的模棱两可的错误。

修改 UAT 配置文件就足够了。

TLDR;

确保您在 UAT 配置文件中指向正确的 URL 端点并提取 .war 以检查您的 application.properties 文件。

【讨论】:

以上是关于无法覆盖 UAT 配置文件环境中的 Tomcat 默认文件大小限制的主要内容,如果未能解决你的问题,请参考以下文章

将所有环境(dev uat prod)的 jar 和配置打包在一个 zip 中是一种好习惯吗?

如何将环境配置文件配置添加到 SBT

如何配置 Keycloak 服务器实例以同时支持开发和 UAT 环境?

实现同一套代码配置多个测试环境(uat/dev/sit/pro)

什么是 开发环境测试环境生产环境UAT环境仿真环境

vue利用webpack搭建开发,uat,生产三套环境