Spring MVC 文件上传的MaxUploadSizeExceededException异常处理

spring MVC上传文件使用了common.fileupload组件,该组件上传文件的时候有个文件大小的限制,在超出这个限制之后.会抛出MaxUploadSizeExceededException异常.

该异常是spring检查上传文件的信息的时候抛出的,此时还没进入Controller内解析文件的方法中.


网上查到的方法是:

1 使用org.springframework.web.servlet.handler.SimpleMappingExceptionResolver,如:

[html]  view plain copy
  1. <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  
  2.     <property name="exceptionMappings">  
  3.    <props>  
  4.         <prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">error/maxUploadExceeded</prop>  
  5.    </props>   
  6. </property>  
个人更赞成这种方式,因为multipartResolver通常是全局使用的,指定的maxUploadSize通常也是全局的,这里应该配置一个全局异常处理来响应。

自己实现.HandlerExceptionResolver类,如
[java]  view plain copy
  1. public class MyHandlerExceptionResolver implements HandlerExceptionResolver {  
  2.     private Log log = LogFactory.getLog(getClass());  
  3.     public ModelAndView resolveException(HttpServletRequest request,  
  4.             HttpServletResponse response, Object handler, Exception ex) {  
  5.         log.warn("Handle exception: " + ex.getClass().getName());  
  6.                 
  7.         Map model = new HashMap();  
  8.         model.put("ex", ex.getClass().getSimpleName());  
  9.         model.put("error", ex.getMessage());  
  10.         return new ModelAndView("error", model);  
  11.     }  

另定义<bean class="MyHandlerExceptionResolver "/>


这两种方法的侵入性真的太大了,查看源代码org.springframework.web.multipart.commons.CommonsMultipartResolver 127行

[java]  view plain copy
  1. if (this.resolveLazily) {  
  2.             return new DefaultMultipartHttpServletRequest(request) {  
  3.                 @Override  
  4.                 protected void initializeMultipart() {  
  5.                     MultipartParsingResult parsingResult = parseRequest(request);  
  6.                     setMultipartFiles(parsingResult.getMultipartFiles());  
  7.                     setMultipartParameters(parsingResult.getMultipartParameters());  
  8.                 }  
  9.             };  
  10.         }  

有个resolveLazily属性,一个类似懒加载的属性.可以定义该属性.让解析文件的时候再抛异常,然后Controller中定义异常处理的方法

[html]  view plain copy
  1. <bean id="multipartResolver"  
  2.         class="org.springframework.web.multipart.commons.CommonsMultipartResolver"  
  3.         p:defaultEncoding="utf-8" >  
  4.       <property name="resolveLazily" value="true"/>  
  5.       <property name="maxUploadSize" value="1024" />  
  6.     </bean>  
定义异常处理的方法
/**
     * 异常处理
     * @param ex
     * @param request
     * @Description:
     */
    @ExceptionHandler(Exception.class)
    public void handleException(Exception ex,HttpServletRequest request,HttpServletResponse response){
        StringBuffer sb = new StringBuffer();
        sb.append("<script language='javascript'>history.go(-1);alert('");
        if (ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){
            sb.append("文件大小不应大于"+((MaxUploadSizeExceededException)ex).getMaxUploadSize()/1000+"kb");
         } else{
             sb.append("上传异常!");
        }
        sb.append("!');</script>");
        try {
            System.out.println(sb.toString());
            response.setContentType("text/html; charset=utf-8");  
            response.getWriter().println(sb.toString());
            response.getWriter().flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return;
    }


[java]  view plain copy
  1. @ExceptionHandler(Exception.class)       
  2.     public String handleException(Exception ex,HttpServletRequest request) {     
  3.         if(ex instanceof org.springframework.web.multipart.MaxUploadSizeExceededException){  
  4.             request.setAttribute("error""文件超过长度");  
  5.         }  
  6.         return "要转向的页面,可以自由定义或者是原页面.";  
  7.     }  

你可能感兴趣的:(Spring MVC 文件上传的MaxUploadSizeExceededException异常处理)