web項目上傳文件太大異常處理思路

在web項目中,經常會遇到上傳文件的需求,有時需要單個上傳,有時需要批量上傳。默認情況下,支持文件的大小是1M。當默認配置不符合業(yè)務需求時,需要我們調整支持文件上傳大小的限制。若上傳文件大小超過支持的大小,后臺會拋出異常。本文主要基于springboot講解如何配置支持文件的大小,并且對于超過大小時異常如何處理。
上傳文件的請求提交到服務器之后,首先請求會交由SpringMVC的DispatcherServlet進行處理,調用該方法的doService方法進行請求處理;當收到請求時 DispatcherServlet 的 checkMultipart() 方法會調用 ultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件。如果請求數(shù)據(jù)中包含文件,則調用 MultipartResolver 的resolveMultipart() 方法對請求的數(shù)據(jù)進行解析,然后將文件數(shù)據(jù)解析成 MultipartFile 并封裝在MultipartHttpServletRequest (繼承了 HttpServletRequest) 對象中,最后傳遞給 Controller。
resolveMultipart方法處理邏輯包含了對文件大小限制的判斷,如果超過大小會拋出異常。


文件處理邏輯源碼

代碼中,F(xiàn)ileUpload類中的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
        /// 設置總上傳數(shù)據(jù)總大小
        factory.setMaxRequestSize("1024000KB");
        return factory.createMultipartConfig();
    }
}

2.上傳文件超過指定大小的異常處理

如果文件超過設定的大小,后臺會拋出MultipartException異常,F(xiàn)ileSizeLimitExceededException、SizeLimitExceededException均是改異常的子類。為了能給用戶友好的提示,我們需要對該異常進行處理,提示出系統(tǒng)支持文件的大小。
下面使用SpringBoot中統(tǒng)一異常處理的思路進行處理。

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配置用于配置上載的字節(jié)數(shù),默認為2M。如果您嘗試上傳的文件大小超出了大小限制,則Tomcat會將其裁剪為默認的2mb并重置連接。
將maxSwallowSize設置為-1表示無限制。
----------------------對maxSwallowSize參數(shù)還需要進一步理解----------------------------

2.2統(tǒng)一異常配置

@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版本不可用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 這篇文章主要學習MultipartResolver接口,通過這個實現(xiàn)類來解析請求中的內容。1.我們有兩種選擇來解析...
    Lee_java閱讀 3,482評論 0 0
  • 詳細描述PHP處理web上傳文件的流程,如何限制上傳文件的大小不能超過某個數(shù)值? 1.流程:首先用戶在瀏覽器端選擇...
    金星show閱讀 1,061評論 0 2
  • 需求:項目要支持大文件上傳功能,經過討論,初步將文件上傳大小控制在500M內,因此自己需要在項目中進行文件上傳部分...
    jianshu1212閱讀 574評論 0 0
  • 背景 上傳文件是互聯(lián)網中常常應用的場景之一,最典型的情況就是上傳頭像等,今天就帶著帶著大家做一個Spring Bo...
    weisen閱讀 1,690評論 1 1
  • 推薦指數(shù): 6.0 書籍主旨關鍵詞:特權、焦點、注意力、語言聯(lián)想、情景聯(lián)想 觀點: 1.統(tǒng)計學現(xiàn)在叫數(shù)據(jù)分析,社會...
    Jenaral閱讀 6,037評論 0 5

友情鏈接更多精彩內容