Undertow文件上传10M以上抛异常UT000020: Connection terminated as request was larger than 10485760

当使用Undertow作为web容器的SpringBoot或Spring Cloud应用上传文件超过10M时,会遇到异常。解决这个问题需要在配置文件中进行调整,允许更大的上传限制。通过增加特定的yaml配置,可以成功解决文件上传超过10M的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现象描述

上传文件至OSS,当文件超过10M时,提示:

io.undertow.server.RequestTooBigException: UT000020: Connection terminated as request was larger than 10485760

解决思路

通过异常描述,有可能是上传限制导致,matecloud使用的web容器是undertow,经尝试,通过修改配置文件的方式可以解决此问题。

解决方案

增加如下的配置文件到你的yaml文件下,即可解决。

spring:
  servlet:
    multipart:
     # 文件最大限制
      max-file-size: 1024MB
      # 请求最大限制
      ma
### 连接终止问题解决方案 当 Undertow 的请求大小超出默认限制10 MB 或 10485760 字节)时,会触发 `io.undertow.server.RequestTooBigException` 异常并中断连接。此行为可以通过调整配置来解决。 #### 配置 Undertow 请求大小限制Spring Boot 应用程序中,可以修改 Undertow 的最大实体大小设置以支持更大的文件上传。通过自定义 Undertow 嵌入式服务器的配置实现这一点: ```java import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class UndertowConfig { @Bean public UndertowServletWebServerFactory undertowEmbedded() { UndertowServletWebServerFactory factory = new UndertowServletWebServerFactory(); // 设置最大实体大小为 50MB (单位字节) factory.addBuilderCustomizers(builder -> builder.setSocketOption(Options.MAX_ENTITY_SIZE, 52428800L)); return factory; } } ``` 上述代码片段设置了最大实体大小为 50 MB[^1]。如果应用程序需要更高的上限,则可以根据需求进一步增加该值。 #### 调整应用层逻辑处理大文件 除了调整服务器端的最大实体大小外,还需要确保前端和中间件不会因超时或其他原因阻止大文件传输。例如,在使用 OSS 存储服务时,应考虑分片上传策略以提高稳定性。 以下是基于阿里云 OSS SDK 实现的大文件分片上传示例: ```java import com.aliyun.oss.OSS; import com.aliyun.oss.model.CompleteMultipartUploadRequest; import com.aliyun.oss.model.InitiateMultipartUploadRequest; import com.aliyun.oss.model.PartETag; import com.aliyun.oss.model.UploadPartRequest; import java.util.ArrayList; import java.util.List; public class OssFileUploader { private final OSS ossClient; public OssFileUploader(OSS ossClient) { this.ossClient = ossClient; } public void uploadLargeFile(String bucketName, String objectKey, File file) throws Exception { long partSize = 5 * 1024 * 1024; // 每个分片大小设为 5MB InitiateMultipartUploadRequest initReq = new InitiateMultipartUploadRequest(bucketName, objectKey); String uploadId = ossClient.initiateMultipartUpload(initReq).getUploadId(); List<PartETag> partETags = new ArrayList<>(); long fileSize = file.length(); int partCount = (int) ((fileSize + partSize - 1) / partSize); for (int i = 0; i < partCount; i++) { long startPos = i * partSize; long curPartSize = Math.min(partSize, fileSize - startPos); UploadPartRequest uploadReq = new UploadPartRequest(); uploadReq.setBucketName(bucketName); uploadReq.setKey(objectKey); uploadReq.setUploadId(uploadId); uploadReq.setPartNumber(i + 1); // 分片编号从 1 开始计数 uploadReq.setInputStream(new FileInputStream(file)); uploadReq.setPartSize(curPartSize); PartETag partETag = ossClient.uploadPart(uploadReq); partETags.add(partETag); } CompleteMultipartUploadRequest completeReq = new CompleteMultipartUploadRequest(bucketName, objectKey, uploadId, partETags); ossClient.completeMultipartUpload(completeReq); } } ``` 这段代码实现了将大型文件分割成多个部分分别上传到 OSS,并最终完成整个文件的拼接操作。 #### 关于 WebSocket 和 TCP 断开的影响 需要注意的是,即使解决了 HTTP 文件上传中的大小限制问题,但如果底层 TCP 连接意外关闭,仍可能导致数据丢失或不完整的风险。因此建议监控网络状态以及合理设计重试机制来增强系统的健壮性[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值