SpringBoot设置上传文件的大小

博主使用SpringBoot+Mybatis+shiro做文件上传时,遇到字段超出最大允许大小的错误,原因是springboot内置tomact文件传输默认1MB。文中介绍了springboot 2.X系列的处理方式,如在启动类配置、在配置文件添加信息等。

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

今天使用SpringBoot+Mybatis+shiro做文件上传时遇到一个错误:

org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fileContext exceeds its maximum permitted size of 1048576 bytes.] with root cause

意思是:字段fileContext超出其最大允许大小1048576字节。

因为springboot内置tomact的的文件传输默认为1MB,如果不进行配置则会出现以下错误

2019-05-08/13:18:34.006|||||^_^|[http-nio-8080-exec-9] DEBUG org.apache.shiro.web.servlet.SimpleCookie 389 - Found 'JSESSIONID' cookie value [168f49ad-02af-46dc-8862-cfcc4069f2ba]
2019-05-08/13:18:34.017|||||^_^|[http-nio-8080-exec-9] ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] 175 - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.multipart.MaxUploadSizeExceededException: Maximum upload size exceeded; nested exception is java.lang.IllegalStateException: org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fileContext exceeds its maximum permitted size of 1048576 bytes.] with root cause
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field fileContext exceeds its maximum permitted size of 1048576 bytes.
	at org.apache.tomcat.util.http.fileupload.FileUploadBase$FileItemIteratorImpl$FileItemStreamImpl$1.raiseError(FileUploadBase.java:633)
	at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.checkLimit(LimitedInputStream.java:76)
	at org.apache.tomcat.util.http.fileupload.util.LimitedInputStream.read(LimitedInputStream.java:135)
	at java.io.FilterInputStream.read(FilterInputStream.java:107)
	at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:98)
	at org.apache.tomcat.util.http.fileupload.util.Streams.copy(Streams.java:68)
	at org.apache.tomcat.util.http.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:293)
	at org.apache.catalina.connector.Request.parseParts(Request.java:2855)
	at org.apache.catalina.connector.Request.parseParameters(Request.java:3194)
	at org.apache.catalina.connector.Request.getParameter(Request.java:1116)
	at org.apache.catalina.connector.RequestFacade.getParameter(RequestFacade.java:381)
	at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:84)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:200)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:834)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1415)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

springboot 2.X系列处理方式

第一种、直接在springboot的启动类里加入下面的代码。

在配置类中配置@Bean,注意当前配置类上需要加注解@Configuration

    /**  
     * 文件上传配置  
     * @return  
     */  
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //文件最大10M,DataUnit提供5中类型B,KB,MB,GB,TB
        factory.setMaxFileSize(DataSize.of(10, DataUnit.MEGABYTES));
        /// 设置总上传数据总大小10M
        factory.setMaxRequestSize(DataSize.of(10, DataUnit.MEGABYTES));
        return factory.createMultipartConfig();
    }

第二种、在application.properties中添加如下配置信息

配置文件直接配置,与springboot2.x版本一致

application.properties

    #文件上传大小为20M        
    spring.servlet.multipart.max-file-size=20MB
    #请求大小为20M
    spring.servlet.multipart.max-request-size=20MB

application.yml

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

maxFileSize 是单个文件大小
maxRequestSize是设置总上传的数据大小
这就可以了。

根据自己需求定义吧,只能是MB和KB两种类型,字母大小写随意,Long类型可以的
另外这是MultipartConfigFactory类中的转换,可以瞅一眼

  private long parseSize(String size) {  
     Assert.hasLength(size, "Size must not be empty");
        size = size.toUpperCase(Locale.ENGLISH);
        if (size.endsWith("KB")) {
            return Long.valueOf(size.substring(0, size.length() - 2)) * 1024L;
        } else {
            return size.endsWith("MB") ? Long.valueOf(size.substring(0, size.length() - 2)) * 1024L * 1024L : Long.valueOf(size);
        }
  } 

原文地址:https://blog.youkuaiyun.com/qq_28089993/article/details/76854112

在 Spring Boot 项目中配置文件上传大小限制是常见的需求,尤其是在处理大文件上传时。Spring Boot 提供了简洁的配置方式,可以通过 `application.properties` 或 `application.yml` 文件进行设置。 ### 配置单个文件大小与请求总大小 Spring Boot 中通过 `spring.servlet.multipart.max-file-size` 和 `spring.servlet.multipart.max-request-size` 属性来分别控制单个文件的最大大小和整个请求的最大大小[^2]。例如,若希望支持最大为 50MB 的单个文件上传,并且允许一次请求上传多个文件大小不超过 200MB,可以在 `application.properties` 中添加以下配置: ```properties spring.servlet.multipart.max-file-size=50MB spring.servlet.multipart.max-request-size=200MB ``` 如果使用的是 `application.yml`,则配置如下: ```yaml spring: servlet: multipart: max-file-size: 50MB max-request-size: 200MB ``` ### 配置更多上传相关参数 除了上述基本配置外,还可以进一步自定义上传行为,包括启用或禁用文件上传、指定上传文件的存储路径、设置文件写入磁盘的阈值等[^4]。以下是一个完整的配置示例: ```yaml spring: servlet: multipart: enabled: true location: /tmp/upload file-size-threshold: 10MB max-file-size: 50MB max-request-size: 200MB resolve-lazily: false ``` - `enabled`: 是否启用文件上传功能,默认为 `true`。 - `location`: 指定上传文件的临时存储路径。 - `file-size-threshold`: 当文件大小超过该值时,文件将被写入磁盘而不是内存,默认为 `0B`(全部写入内存)。 - `resolve-lazily`: 是否延迟解析上传文件,默认为 `false`。 ### 文件大小校验逻辑 为了避免因文件过大而导致服务器错误,可以在上传前对文件大小进行校验。以下是一个 Java 方法示例,用于检查上传文件大小是否符合要求[^3]: ```java /** * 判断文件大小 * @param file 上传文件 * @param size 文件大小限制值 * @param unit 单位(B, K, M, G) * @return 如果文件大小在限制范围内返回 true,否则返回 false */ public static boolean checkFileSize(MultipartFile file, int size, String unit) { long len = file.getSize(); double fileSize = 0; if ("B".equals(unit.toUpperCase())) { fileSize = (double) len; } else if ("K".equals(unit.toUpperCase())) { fileSize = (double) len / 1024; } else if ("M".equals(unit.toUpperCase())) { fileSize = (double) len / 1048576; } else if ("G".equals(unit.toUpperCase())) { fileSize = (double) len / 1073741824; } return fileSize <= size; } ``` 此方法可用于前端提示用户选择合适大小文件,从而避免不必要的上传失败。 ### 默认限制说明 需要注意的是,Spring Boot 对上传文件大小有默认限制:单个文件最大为 1MB,单次请求所有文件大小最大为 10MB[^5]。因此,在需要处理更大的文件时,必须显式调整这些配置。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值