在項目中使用springMVC 上傳檔案的時候,在上傳檔案的大小超過設定的值之後,異常解析器中的異常輸出資訊無法輸出。
上傳檔案的時候有個檔案大小的限制,在超出這個限制之後.會抛出MaxUploadSizeExceededException異常,該異常是spring檢查上傳檔案的資訊的時候抛出的,此時還沒進入Controller内解析檔案的方法中。
産生原因:tomcat7.0.65版本的bug。
a:超過檔案大小的:
b:沒超過限定大小的檔案上傳成功之後傳回資料正确.
解決方式:
1:
更換tomcat版本。
apache-tomcat-7.0.67 (不可用)
apache-tomcat-7.0.65 (不可用)
apache-tomcat-7.0.38(可用)
apache-tomcat-7.0.39 (可用)
apache-tomcat-7.0.70 (可用) 2:攔截器處理
<!-- 單檔案上傳大小20M ,這裡需要設定的大一點,避免在攔截器之前出現異常,很重要,這裡是400M-->
<!--maxUploadSize 使用攔截器時可以不用設定-->
<property name="maxUploadSize" value="409715200"/>
<property name="defaultEncoding" value="UTF-8" />
</bean>
中的最大上傳值弄大一點,避免抛出異常
<mvc:interceptors> <mvc:interceptor> <!--此處隻攔截檔案上傳的請求--> <mvc:mapping path="/file/fileUpload.do"/> <bean class="com.sso.interceptor.FileInterceptor"> <property name="MAX_UPLOAD_SIZE" value="20971520"/> </bean> </mvc:interceptor> </mvc:interceptors>
建立攔截器 FileInterceptor.Java public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //判斷是否是多檔案上傳的請求 if (request != null && ServletFileUpload.isMultipartContent(request)) { ServletRequestContext requestContext = new ServletRequestContext(request); long requsetSize = requestContext.getContentLength(); if (requsetSize > MAX_UPLOAD_SIZE) { ObjectMapper mapper = new ObjectMapper(); response.setContentType(MediaType.APPLICATION_JSON_VALUE); PrintWriter writer = response.getWriter(); //json輸出提示資訊 JSONObject json = new JSONObject(); json.put("message", "上傳檔案太大,不能超過" + maxSize / 1024 / 1024 + "M !"); json.put("status", "1"); mapper.writeValue(writer,json); writer.flush(); return false; } } return true; }