天天看點

SpringMVC ajaxFileUploa上傳檔案出現 Provisional headers are shown 和 response 資料 無法輸出問題...

在項目中使用springMVC 上傳檔案的時候,在上傳檔案的大小超過設定的值之後,異常解析器中的異常輸出資訊無法輸出。

上傳檔案的時候有個檔案大小的限制,在超出這個限制之後.會抛出MaxUploadSizeExceededException異常,該異常是spring檢查上傳檔案的資訊的時候抛出的,此時還沒進入Controller内解析檔案的方法中。

産生原因:tomcat7.0.65版本的bug。

a:超過檔案大小的:

SpringMVC ajaxFileUploa上傳檔案出現 Provisional headers are shown 和 response 資料 無法輸出問題...
SpringMVC ajaxFileUploa上傳檔案出現 Provisional headers are shown 和 response 資料 無法輸出問題...

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; }

繼續閱讀