spring-boot 上传文件报错“spring.servlet.multipart.max-file-size”

最近遇到这么一个问题,前后折磨了两天,最近有空记载一下,以供学习!
不多说,直接上思路:该问题本质其实就是上传的文件过大,超过了设定的阈值,然后服务直接给你断了,文件上传到一半就失败了
首先,根据在各大博客中搜索,最多的答案都是:需要在application.properties中配置:

#配置文件传输
spring.servlet.multipart.enabled =true  
spring.servlet.multipart.file-size-threshold =0
#单个数据的大小
spring.servlet.multipart.max-file-size = 100Mb
#总数据的大小
spring.servlet.multipart.max-request-size=100Mb

里面包括Spring Boot 1.3.x ,Spring Boot 1.4.x and 1.5.x,Spring Boot 2.x各种不同版本的不同写法我全部都试过了,但是依然没用。
为了确定是否是因为配置未生效所导致的,我直接在启动类里,添加如下代码

 @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //单个文件最大
        factory.setMaxFileSize(DataSize.parse("100MB"));
        /// 设置总上传数据总大小
        factory.setMaxRequestSize(DataSize.parse("100MB"));
        return factory.createMultipartConfig();
    }

通过断点能肯定,配置确实已经生效了,但是问题依然未解决。于是,我开始把问题重新定位,如果问题不在后台,那只能在前台,我把思路转向了nginx配置,经过我的一番查找,终于发现了新思路,在nginx的nginx.conf配置文件中加上

http {
  client_max_body_size 100M;
}

来调整允许的客户端上传文件的body大小。设置为0,表示不限制。

前台如果需要做个错误提示展现,可以在后台写个全局拦截,用作反馈提示。代码如下

@RestControllerAdvice
public class GlobalExceptionHandler {

    static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    @ExceptionHandler(value = Exception.class)
    public @ResponseBody
    ResultWrapper handleBusinessException(Exception ex) {
        String msg;
        if (ex.getCause().getCause() instanceof FileSizeLimitExceededException) {
            logger.error(ex.getMessage());
            msg = "上传文件过大[单文件大小不得超过100M]";
        } else if (ex.getCause().getCause() instanceof SizeLimitExceededException) {
            logger.error(ex.getMessage());
            msg = "上传文件过大[总上传文件大小不得超过100M]";
        } else {
            msg = "上传文件失败";
            ResultWrapper.error(500, msg);
        }
        return ResultWrapper.error(500, msg);
    }
}

至此,问题解决!

Spring Framework 是一个流行的 Java 应用程序开发框架,它提供了一组完整的应用程序开发工具和库,包括 Spring MVC、Spring BootSpring Security、Spring Data 等等。其中,Spring MVC 是一个基于 Servlet API 的 Web 框架,它使用了前端控制器模式,通过 DispatcherServlet 统一处理请求,将请求分发给不同的处理器进行处理。 在 Spring MVC 中,Spring 容器会自动注册一个名为 DispatcherServletServlet,它是整个应用程序的前端控制器,负责接收所有的 HTTP 请求,并将请求转发给相应的处理器进行处理。在 web.xml 文件中,我们需要配置 DispatcherServlet,同时也需要为其配置一个 URL 映射,以便将请求正确地分发给 DispatcherServlet 进行处理。配置如下: ```xml <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` 在上面的配置中,我们指定了 DispatcherServlet 的名称为 dispatcherServlet,并将其 servlet-class 设置为 org.springframework.web.servlet.DispatcherServlet。我们还将其 load-on-startup 属性设置为 1,表示在应用程序启动时就加载该 Servlet。在 servlet-mapping 中,我们将 DispatcherServlet 映射到根路径 /,这意味着所有的 HTTP 请求都将被转发给 DispatcherServlet 进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值