`
yo8237233
  • 浏览: 61085 次
  • 来自: 深圳
社区版块
存档分类
最新评论

spring mvc CommonsMultipartResolver上传文件异常处理

    博客分类:
  • J2EE
阅读更多
近期已经上线的项目出现了一个异常

严重: Servlet.service() for servlet JeeCmsAdmin threw exception  
org.apache.commons.fileupload.FileUploadBase$SizeLimitExceededException: the request was rejected because its size (2152078) exceeds the configured maximum (2097152)  
    at org.apache.commons.fileupload.FileUploadBase$FileItemIteratorImpl.<init>(FileUploadBase.java:914)  
    at org.apache.commons.fileupload.FileUploadBase.getItemIterator(FileUploadBase.java:331)  
    at org.apache.commons.fileupload.FileUploadBase.parseRequest(FileUploadBase.java:349)  
    at org.apache.commons.fileupload.servlet.ServletFileUpload.parseRequest(ServletFileUpload.java:126)  
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.parseRequest(CommonsMultipartResolver.java:155)  
    at org.springframework.web.multipart.commons.CommonsMultipartResolver.resolveMultipart(CommonsMultipartResolver.java:138)  


这个异常是由于上传文件过大引起来的,这里指的是上传文件的总量,而不是单个的文件。
由于之前已经对上传文件在控制器进行过单个验证,但是此异常是在请求还未到达控制器的时候就已经被spring容器捕获抛出异常了,故无法在控制器对进行文件校验

	<bean id="multipartResolver" class="com.sinolife.sf.framework.comm.CommonsMultipartResolver">
		<property name="maxUploadSize" value="50946048" />
		<property name="resolveLazily" value="true"/>  
	</bean>


这时就想在前台对文件进行大小校验,但是由于需要兼容的浏览器较多,纯前端代码无法完全适应浏览器的兼容器,不得不放弃放弃了JS校验。

最后在控制器中使用注解拦截了异常,对其进行处理

	@ExceptionHandler(MaxUploadSizeExceededException.class)         
    public String 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("文件大小不应大于"+getFileKB(((MaxUploadSizeExceededException)ex).getMaxUploadSize()));
//	         } 
//	        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;
    }      


这样虽然捕获了异常,对其进行了处理,但是用户体验不怎么好,下一篇利用iframe实现无刷新上传处理

最后再给出起初利用JS进行文件大小校验的代码
<img alt="" src="" id="temping" style="display: none;">	            

	var maxsize = 10*1024*1024;//2M  
    var errMsg = "上传的附件文件不能超过2M!!!";  
    var tipMsg = "您的浏览器暂不支持计算上传文件的大小,确保上传文件不要超过2M,建议使用IE、FireFox、Chrome浏览器。";  
    var  browserCfg = {};  
    var ua = window.navigator.userAgent;  
    if (ua.indexOf("MSIE")>=1){  
        browserCfg.ie = true;  
    }else if(ua.indexOf("Firefox")>=1){  
        browserCfg.firefox = true;  
    }else if(ua.indexOf("Chrome")>=1){  
        browserCfg.chrome = true;  
    }  


try{  
	                var obj_file = document.getElementById("chargeFront");  
	                if(obj_file.value==""){  
	                    alert("请先选择上传文件");  
	                    return;  
	                }  
	                
	                var filesize = 0;  
	                if(browserCfg.firefox || browserCfg.chrome ){  
	                    filesize = obj_file.files[0].size;  
	                }else if(browserCfg.ie){  
	                    var obj_img = document.getElementById('temping');  
		                alert('浏览器判断2' + obj_file.value);
	                    obj_img.src =obj_file.value; 
	                    filesize = obj_img.fileSize; 
	                    alert(filesize);
	                    
	                    var fso,f,fname,fsize;
	                    var flength=40000; //设置上传的文件最大值(单位:kb),超过此值则不上传。 
	                    fso=new ActiveXObject("Scripting.FileSystemObject");
	                    f=fso.GetFile(obj_file.value);//文件的物理路径
	                    fsize=f.Size; //文件大小(bit)
	                    fsize=fsize/1024;
	                    //去掉注释,可以测试
	                    alert("文件路径:"+f);
	                    alert("文件名:"+fname);
	                    alert("文件大小:"+fsize+"kb");
	                }else{  
	                    alert("非IE 谷歌" + tipMsg);  
	                return;  
	                }  
	                
	                if(filesize==-1){  
	                    alert("-1的情况"+tipMsg);  
	                    return;  
	                }else if(filesize>maxsize){  
	                    alert("不是-1的情况" + errMsg);  
	                    return;  
	                }else{  
	                    alert("文件大小符合要求");  
	                    return;  
	                }  
	            }catch(e){  
	                alert(e);  
	            }  


博客地址:http://qiaoyihang.iteye.com/
分享到:
评论

相关推荐

    spring mvc文件上传实现进度条

    spring mvc文件上传,通过监听器实现进度条

    spring mvc统一处理异常

    spring mvc统一处理异常,通过@ControllerAdvice+@ExceptionHandler

    精通Spring MVC 4

    本书共计10章,分别介绍了快速搭建Spring Web应用、精通MVC结构、URL映射、文件上传与错误处理、创建Restful应用、保护应用、单元测试与验收测试、优化请求、将Web应用部署到云等内容,循序渐进地讲解了Spring MVC4...

    Spring CommonsMultipartResolver 上传文件

    Spring CommonsMultipartResolver 上传文件,源码中包括spring的注解和视图交互及数据应用,上传文件等

    Spring MVC 文件上传下载 后端 - Java.zip

    Spring MVC 文件上传下载 后端 - Java.zip

    spring mvc异常处理

    spring mvc异常处理,详细参考http://blog.csdn.net/xiejx618/article/details/41918611

    Spring MVC入门教程

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...

    Spring MVC 教程 快速入门 深入分析

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求 ...

    spring mvc上传文件

    清晰的注释和简单明了的代码,绝对让你瞬间掌握如何使用ajax上传的的要领,实现举一反三

    spring mvc的配置文件详解

    简单的描述了spring mvc的配置示例,不包括注解方法和示例代码

    Spring MVC文件上传下载

    Spring MVC文件上传下载,是http://blog.csdn.net/geloin/article/details/7537425#comments的配套资源。

    SpringMVC框架架构介绍

    十一、spring mvc 如何实现全局的异常处理? 十二、spring mvc 如何把全局异常记录到日志中? 十三、如何给spring3 MVC中的Action做JUnit单元测试? 十四、spring mvc 转发与重定向 十五、spring mvc 处理ajax请求...

    spring mvc上传 下载ftp文件

    spring mvc上传 下载ftp文件

    SpringMVCDemo:Spring MVC 框架知识案例

    1.创建第一个 Spring MVC 程序案例 2.Spring MVC @RequestMapping 注解案例 3.Spring MVC 请求参数的获取案例 4.Spring MVC 域对象共享数据案例 5.Spring MVC @ModelAttribute 注解案例 ...15.Spring MVC 异常处理案例

    [免费]Spring MVC学习指南(高清)

    全书共计12章,分别从Spring框架、模型2和MVC模式、Spring MVC介绍、控制器、数据绑定和表单标签库、传唤器和格式化、验证器、表达式语言、JSTL、国际化、上传文件、下载文件多个角度介绍了Spring MVC。除此之外,...

    Spring MVC+MyBatis开发从入门到项目实战

    第3篇是Spring MVC技术入门,包括Spring MVC的背景介绍、架构整体剖析、环境搭建、处理器与映射器的讲解、前端控制器的源码分析、多种视图解析器的介绍、请求映射与参数绑定的介绍、Validation校验与异常处理和拦截...

    spring mvc 官方文档

    本文详细介绍spring MVC的原理和开发心得体会。

    spring mvc 文件上传 代码完整版

    spring mvc框架下的文件上传,支持多文件上传,代码完整版,试运行过OK,没有问题。

    精通Spring MVC 4 中文

    精通Spring MVC 4 中文

Global site tag (gtag.js) - Google Analytics