无法覆盖 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 表单吗?你在用什么enctype
? multipart/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-Type
是 multipart/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 中是一种好习惯吗?
如何配置 Keycloak 服务器实例以同时支持开发和 UAT 环境?