web项目上传文件太大异常处理思路

在web项目中,经常会遇到上传文件的需求,有时需要单个上传,有时需要批量上传。默认情况下,支持文件的大小是1M。当默认配置不符合业务需求时,需要我们调整支持文件上传大小的限制。若上传文件大小超过支持的大小,后台会抛出异常。本文主要基于springboot讲解如何配置支持文件的大小,并且对于超过大小时异常如何处理。
上传文件的请求提交到服务器之后,首先请求会交由SpringMVC的DispatcherServlet进行处理,调用该方法的doService方法进行请求处理;当收到请求时 DispatcherServlet 的 checkMultipart() 方法会调用 ultipartResolver 的 isMultipart() 方法判断请求中是否包含文件。如果请求数据中包含文件,则调用 MultipartResolver 的resolveMultipart() 方法对请求的数据进行解析,然后将文件数据解析成 MultipartFile 并封装在MultipartHttpServletRequest (继承了 HttpServletRequest) 对象中,最后传递给 Controller。
resolveMultipart方法处理逻辑包含了对文件大小限制的判断,如果超过大小会抛出异常。


文件处理逻辑源码

代码中,FileUpload类中的sizeMax和fileSizeMax的值来自于MultipartConfigElement类中的属性。也即在springboot中通过配置MultipartConfigElement类,来配置文件的大小。

1.后台配置支持文件大小的方式

1.1配置文件配置

spring.servlet.multipart.maxFileSize=100MB
spring.servlet.multipart.max-request-size=1024MB

1.2Bean方式配置

@Configuration
public class UploadConfig {
 
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //单个文件最大
        factory.setMaxFileSize("20480KB"); //KB,MB
        /// 设置总上传数据总大小
        factory.setMaxRequestSize("1024000KB");
        return factory.createMultipartConfig();
    }
}

2.上传文件超过指定大小的异常处理

如果文件超过设定的大小,后台会抛出MultipartException异常,FileSizeLimitExceededException、SizeLimitExceededException均是改异常的子类。为了能给用户友好的提示,我们需要对该异常进行处理,提示出系统支持文件的大小。
下面使用SpringBoot中统一异常处理的思路进行处理。

2.1配置Tomcat的MaxSwallowSize

//配置tomcat,使的上传文件超过设置的值时,进行提醒。
    @Bean
    public ServletWebServerFactory tomcatEmbedded() {
        TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
        tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
            if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
                ((AbstractHttp11Protocol<?>)
                        connector.getProtocolHandler()).setMaxSwallowSize(-1);
            }
        });
        return tomcat;
    }

maxSwallowSize配置用于配置上载的字节数,默认为2M。如果您尝试上传的文件大小超出了大小限制,则Tomcat会将其裁剪为默认的2mb并重置连接。
将maxSwallowSize设置为-1表示无限制。
----------------------对maxSwallowSize参数还需要进一步理解----------------------------

2.2统一异常配置

@ControllerAdvice   
public class BaseController{
    
    private final static Logger LOGGER = LoggerFactory.getLogger(BaseController.class);
    @Autowired
    MultipartConfigElement  fileSizeConfig ;
    
    @ExceptionHandler(value = MultipartException.class)
    @ResponseBody
    public String fileUploadExceptionHandler(MultipartException exception, HttpServletResponse response) {
        String msg="";
        Throwable rootCase=exception.getRootCause();
        if (rootCase instanceof FileSizeLimitExceededException) {//单个文件超过大小
            msg="单文件大小不得超过"+fileSizeConfig.getMaxFileSize()/1024/1024+"M";
        }else if(rootCase instanceof SizeLimitExceededException){//总文件超过大小
            msg="总文件大小不得超过"+fileSizeConfig.getMaxRequestSize()/1024/1024+"M";
        }else {
            msg="上传失败[服务器异常]";
        }
        LOGGER.error(msg, exception);
        return ResultStandardUtil.importingFailMessage(msg); 
    }
}

其中MultipartConfigElement类可以获取到配置支持文件的大小。可以返回前端;
FileSizeLimitExceededException代表单个文件超过支持的大小;
SizeLimitExceededException代表所有文件超过支持的大小;
ResultStandardUtil.importingFailMessage(msg); 是约定返回格式的封装。

这样,当上传的文件超过指定的大小时,就能够将异常信息友好的返回给前端页面进行提示!
注意:该方式在Springboot2.0.5版本下测试可用,2.3版本不可用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355

推荐阅读更多精彩内容