springboot上传文件报超出大小限制

文章描述了一种在SpringBoot应用中遇到文件上传大小超过限制的错误,以及如何通过配置application.yml或创建自定义multipartResolverBean来解决此问题。然而,问题的根源在于外部jar包中已存在覆盖配置的Bean,最终解决方案是排除该Bean并重写配置。

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

报错信息:caused by: org.apache. commons. fileupload. FileUploadBasessizeLimitExceededException:herequest was reje

because its size (23205293) exceeds the configured maximum(20971520)

一:使用的包commons-fileupload-1.5.jar

二:问题排查:网上搜资料说是springboot默认的上传文件大小是1MB,

1.需要在application.yml或application.properties文件中加添加如下配置

spring:

  servlet:

      multipart:

         enabled:true ##开启http上传处理

         max-file-size:  50MB  #单个文件最大限制

         max-request-size:  200MB  #最大请求文件大小

         #file-size-threshold: 0 #当文件达到多少时进行磁盘写入,设置0代表不设限;最后这种并没有用到,只是记录一下

 

2.如果配置未生效,可以添加Bean("multipartResolver")

代码如下:

@Bean("multipartResolver")

@Qualifier("multipartResolver")

@Primary

CommonsMultipartResolver multipartResolver(){

CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();

commonsMultipartResolver.setDefaultEncoding("UTF-8");

commonsMultipartResolver.setMaxUploadSize(150*1024*1024L);//150MB

return commonsMultipartResolver;

}

 

三:以上两种方式都尝试了,还是不行,后面发现在引入的别的项目jar包中已经存在第二种方式的Bean了,配置被覆盖。

1.针对以上情况将现有配置排除在外,在Application.java的启动类上加入注解@ComponentScan(value="com.java",excludeFilters={@ComponentScan.Filter(type=FilterType.REGEX,pattern="com.java.config.MultipartConfig")})//pattern是引入项目的bean配置的.java路径

排除后,重写bean("multipartResolver"),在重写的bean中加入自己想要的配置即可。

 

2.如果是springboot的包要排除则用如下注解@EnableAutoConfiguration(exclude={MultipartAutoConfiguratiin.class})

例如:spring-boot-autoconfigure-2.5.12.jar

 

 

以上是项目中的配置,如果有使用网关和nigix,那么这两个地方也需要

 

 

要在Spring Boot后端进行统一限制文件类型和大小,可以使用Spring Boot的MultipartFile类,通过在控制器中添加自定义注解并结合Spring Boot的拦截器实现。 首先,可以定义一个自定义注解,例如@FileValidator,用于限制文件类型和大小。在注解中添加两个属性,一个是允许上传文件类型(MIME类型),另一个是允许上传文件最大大小。 然后,可以编写一个拦截器,用于拦截文件上传请求,并在拦截器中进行文件类型和大小的验证。如果验证不通过,则可以返回一个自定义的错误信息。 最后,在控制器中使用@FileValidator注解对文件上传进行限制,即可实现Spring Boot后端统一限制文件类型和大小的功能。 以下是一个示例代码: 定义自定义注解: ```java @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) public @interface FileValidator { String[] allowedTypes() default {}; // 允许上传文件类型 long maxSize() default 0; // 允许上传文件最大大小 } ``` 编写拦截器: ```java @Component public class FileUploadInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; MethodParameter[] methodParameters = handlerMethod.getMethodParameters(); for (MethodParameter parameter : methodParameters) { if (parameter.hasParameterAnnotation(FileValidator.class)) { MultipartFile file = ((MultipartHttpServletRequest) request).getFile(parameter.getParameterName()); if (file == null) { throw new CustomException("文件不能为空"); } FileValidator fileValidator = parameter.getParameterAnnotation(FileValidator.class); if (fileValidator.allowedTypes().length > 0 && !Arrays.asList(fileValidator.allowedTypes()).contains(file.getContentType())) { throw new CustomException("文件类型不允许"); } if (fileValidator.maxSize() > 0 && file.getSize() > fileValidator.maxSize()) { throw new CustomException("文件大小超出限制"); } } } } return true; } } ``` 在控制器中使用@FileValidator注解: ```java @PostMapping("/upload") public String handleFileUpload(@RequestParam("file") @FileValidator(allowedTypes = {"image/jpeg", "image/png"}, maxSize = 10485760) MultipartFile file) { // 处理上传文件 } ``` 上面的示例中,@FileValidator注解用于限制文件类型为image/jpeg或image/png,大小不超过10M。拦截器会在请求到达控制器之前对文件进行验证,如果不符合要求,则会抛出CustomException异常。控制器中的@RequestParam注解用于接收上传文件,并结合@FileValidator注解进行限制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值