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

至此,问题解决!

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐