详解SpringBoot中文件上传大小限制问题的解决方案

 更新时间:2025年07月03日 08:18:25   作者:码农阿豪@新空间  
在开发Web应用程序时,文件上传是一个常见的需求,本文将详细介绍如何分析和解决Spring Boot文件上传大小限制问题,并提供多种配置方式,希望对大家有所帮助

1. 引言

在开发Web应用程序时,文件上传是一个常见的需求。然而,Spring Boot默认对上传文件的大小有限制(通常为1MB),当用户上传超过该限制的文件时,系统会抛出MaxUploadSizeExceededException异常,导致上传失败。本文将详细介绍如何分析和解决Spring Boot文件上传大小限制问题,并提供多种配置方式,确保文件上传功能正常运行。

2. 问题分析

2.1 错误日志解读

在用户上传文件时,如果文件大小超过默认限制(1MB),Spring Boot会抛出如下异常:

org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: 
The field files exceeds its maximum permitted size of 1048576 bytes.

这表明上传的文件超过了1048576 bytes(即1MB)的限制。

2.2 异常堆栈分析

从堆栈信息可以看出,该异常是由Tomcat的FileUpload组件触发的,最终被Spring的DispatcherServlet捕获并包装成MaxUploadSizeExceededException

3. 解决方案

3.1 方法1:通过application.properties或application.yml配置

Spring Boot允许我们通过配置文件调整上传文件的大小限制。

使用application.properties

# 单个文件最大大小(这里设置为10MB)
spring.servlet.multipart.max-file-size=10MB
# 整个请求的最大大小(这里设置为20MB)
spring.servlet.multipart.max-request-size=20MB

使用application.yml

spring:
  servlet:
    multipart:
      max-file-size: 10MB
      max-request-size: 20MB

3.2 方法2:通过Java配置类(推荐)

如果希望更灵活地控制文件上传配置,可以使用MultipartConfigFactory来动态设置。

创建MultipartConfig配置类

import org.springframework.boot.web.servlet.MultipartConfigFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.util.unit.DataSize;

import javax.servlet.MultipartConfigElement;

@Configuration
public class MultipartConfig {

    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        // 单个文件大小限制(10MB)
        factory.setMaxFileSize(DataSize.ofMegabytes(10));
        // 总请求大小限制(20MB)
        factory.setMaxRequestSize(DataSize.ofMegabytes(20));
        return factory.createMultipartConfig();
    }
}

3.3 方法3:旧版本Spring Boot(1.x)的配置方式

在Spring Boot 1.x中,配置方式略有不同:

# 旧版本属性名
multipart.maxFileSize=10MB
multipart.maxRequestSize=20MB

4. 进阶优化:文件上传校验

4.1 前端校验

在HTML表单中,可以添加acceptmax-size限制:

<input type="file" name="files" accept=".jpg,.png,.pdf" max-size="10485760" multiple />

4.2 后端校验

在Controller层增加文件大小校验逻辑:

@PostMapping("/upload")
@ApiOperation(value = "渠道账号-文件上传", notes = "渠道账号-文件上传")
public Res<List<String>> uploadChannelFile(
        @RequestParam("files") MultipartFile[] files,
        @RequestParam("channelId") String channelId,
        @RequestParam("agentId") String agentId,
        @RequestParam("opUser") String opUser) {
    try {
        // 检查每个文件大小(10MB限制)
        for (MultipartFile file : files) {
            if (file.getSize() > 10 * 1024 * 1024) {
                return new Res<>(SupResultCode.CODE_900500, "文件大小不能超过10MB", null);
            }
        }
        
        List<String> docLinks = opmChannelAccountService.uploadChannelFiles(files, channelId, agentId, opUser);
        return new Res<>(ResultCode.CODE_000000, ResultCode.MSG_000000, docLinks);
    } catch (Exception e) {
        log.error("文件上传失败", e);
        return new Res<>(SupResultCode.CODE_900500, "文件上传失败: " + e.getMessage(), null);
    }
}

4.3 全局异常处理

可以自定义异常处理器,提供更友好的错误提示:

@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MaxUploadSizeExceededException.class)
    public ResponseEntity<String> handleMaxUploadSizeExceeded(MaxUploadSizeExceededException ex) {
        return ResponseEntity
                .status(HttpStatus.PAYLOAD_TOO_LARGE)
                .body("文件大小超过限制,请上传小于10MB的文件");
    }
}

5. 生产环境建议

5.1 使用分片上传

对于大文件(如视频、大型文档),建议采用分片上传(Chunked Upload):

  • 前端使用File.slice()切分文件
  • 后端使用MultipartFile接收分片并合并

5.2 异步处理

如果文件处理较耗时,可以使用@Async异步处理:

@Async
public void processLargeFile(MultipartFile file) {
    // 处理大文件
}

5.3 存储优化

  • 使用OSS(如阿里云OSS、AWS S3)存储文件
  • 避免直接存储在服务器本地

6. 总结

本文详细介绍了Spring Boot文件上传大小限制问题的解决方案,包括:

  • 配置文件调整(application.properties/application.yml
  • Java配置类方式(推荐)
  • 前端+后端双重校验
  • 全局异常处理优化
  • 生产环境建议(分片上传、异步处理)

通过合理配置和优化,可以有效解决文件上传限制问题,提升用户体验和系统稳定性。

到此这篇关于详解SpringBoot中文件上传大小限制问题的解决方案的文章就介绍到这了,更多相关SpringBoot文件上传限制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现窗口刷新的示例代码

    java实现窗口刷新的示例代码

    本文主要介绍了java实现窗口刷新的示例代码,通过重写paintComponent()方法和调用repaint()方法,可以实现窗口的即时刷新,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 在idea中将java项目中的单个类打包成jar包操作

    在idea中将java项目中的单个类打包成jar包操作

    这篇文章主要介绍了在idea中将java项目中的单个类打包成jar包操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • 基于mybatis查询结果映射不到对象的处理

    基于mybatis查询结果映射不到对象的处理

    这篇文章主要介绍了mybatis查询结果映射不到对象的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • springMVC使用ajaxFailUpload上传图片的方法

    springMVC使用ajaxFailUpload上传图片的方法

    这篇文章主要介绍了springMVC使用ajaxFailUpload上传图片的相关知识,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-06-06
  • 详解SpringMVC中的四种跳转方式、视图解析器问题

    详解SpringMVC中的四种跳转方式、视图解析器问题

    这篇文章主要介绍了SpringMVC的四种跳转方式、视图解析器,springmvc核心配置文件和视图解析器的使用,添加视图解析器,通过案例讲解四种跳转方式,需要的朋友可以参考下
    2022-10-10
  • Mybatis plus枚举处理器的具体使用

    Mybatis plus枚举处理器的具体使用

    在开发中,数据库表中的字段很常见会使用枚举类型来表示一些固定的取值范围,本文主要介绍了Mybatis plus枚举处理器的具体使用,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • Spring Data Jpa 复合主键的实现

    Spring Data Jpa 复合主键的实现

    这篇文章主要介绍了Spring Data Jpa 复合主键的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 23种设计模式(22)java状态模式

    23种设计模式(22)java状态模式

    这篇文章主要为大家详细介绍了23种设计模式之java状态模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Springboot上传excel并将表格数据导入或更新mySql数据库的过程

    Springboot上传excel并将表格数据导入或更新mySql数据库的过程

    这篇文章主要介绍了Springboot上传excel并将表格数据导入或更新mySql数据库的过程 ,本文以Controller开始,从导入过程开始讲述,其中包括字典表的转换,需要的朋友可以参考下
    2018-04-04
  • SpringBoot中分页插件PageHelper的使用详解

    SpringBoot中分页插件PageHelper的使用详解

    分页查询是为了高效展示大量数据,通过分页将数据划分为多个部分逐页展示,原生方法需手动计算数据起始行,而使用PageHelper插件则简化这一过程,本文给大家介绍SpringBoot中分页插件PageHelper的使用,感兴趣的朋友一起看看吧
    2024-09-09

最新评论