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

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 文件上传下载 后端 - Java.zip

    在Spring MVC框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...

    spring mvc uploadify上传文件

    为了使Spring MVC能够处理文件上传,需要在配置中添加`MultipartResolver`。在XML配置中,我们可以使用`CommonsMultipartResolver`: ```xml &lt;bean id="multipartResolver" class="org.springframework.web....

    Spring MVC文件上传

    该方法通常接收一个`MultipartFile`类型的参数,这是Spring MVC为处理上传文件提供的特殊类型。示例代码如下: ```java @Controller public class UploadController { @RequestMapping(value = "/upload", ...

    Spring MVC 文件上传下载

    实际应用中,你可能还需要考虑其他因素,比如文件大小限制、文件类型检查、异常处理、安全性(防止路径遍历攻击)等。通过这些方法,你可以构建一个完整的文件管理系统,满足用户对文件上传和下载的需求。

    spring学习: spring mvc上传文件方法分析

    综上所述,Spring MVC提供了方便的API来处理文件上传,包括配置、表单创建、控制器编写、文件处理和异常处理等步骤。通过了解和实践这些知识点,开发者可以更好地在实际项目中实现文件上传功能。同时,对于源码的...

    spring mvc 文件上传

    总结来说,Spring MVC中的文件上传涉及配置`CommonsMultipartResolver`,创建处理文件上传的控制器,以及在前端创建适当的表单元素。通过`MultipartFile`接口,我们可以方便地访问上传文件的信息并将其保存到服务器...

    spring MVC 上传 &下载

    3. **异常处理**:当上传的文件大小超过了配置的最大值时,Spring MVC会抛出`MaxUploadSizeExceededException`异常。可以通过配置异常处理器来处理这种情况,并跳转到特定的错误页面。 ```xml ...

    Spring MVC示例

    文件上传通常使用了Spring MVC的`CommonsMultipartResolver`,这是一个多部分解析器,能处理HTTP请求中的multipart/form-data类型,支持文件上传。下载则通过设置响应头的Content-Disposition属性,指导浏览器以...

    spring mvc核心包(包含文件上传)

    - 需要注意文件大小限制和异常处理,避免文件过大导致内存溢出或非法文件类型引发安全问题。 7. **配置文件上传** 在Spring MVC的配置中,需要设置最大上传文件大小和总请求大小,例如: ```xml ...

    Spring MVC文件上传大小和类型限制以及超大文件上传bug问题

    在Spring MVC框架中,文件上传是一项常见的功能,但同时也需要考虑...总的来说,Spring MVC提供了灵活的机制来处理文件上传的大小和类型限制,以及异常处理。通过适当的配置和编程,可以确保文件上传操作既安全又高效。

    spring MVC +Mybatis实现的文件上传

    在开发Web应用时,文件...在实际项目中,你可能还需要考虑异常处理、事务管理以及安全性问题,比如防止恶意文件上传、限制上传速率等。通过Spring MVC和Mybatis的组合,我们可以构建出高效且易于维护的文件上传功能。

    关于Spring MVC项目(maven)中通过fileupload上传文件

    在Spring MVC的配置文件(如`dispatcher-servlet.xml`)中,我们需要配置一个`MultipartResolver`,通常是`CommonsMultipartResolver`,这样Spring MVC才能处理多部分表单数据,即文件上传。 5. **控制器...

    spring mvc实现文件上传并携带其他参数的示例

    为了处理文件上传,我们需要在Spring MVC的配置文件(如`spring-mvc.xml`)中添加MultipartResolver,例如使用`CommonsMultipartResolver`: ```xml &lt;bean id="multipartResolver" class="org.springframework.web....

    8-Spring-mvc-文件上传1

    `MultipartFile`是Spring MVC用于处理上传文件的接口。它提供了一些常用方法,如: - `getBytes()`:获取文件的字节数组。 - `getContentType()`:获取文件的MIME类型。 - `getInputStream()`:获取文件的输入流。 -...

    spring mvc学习代码

    4. **文件上传**:Spring MVC提供了一套处理文件上传的API,包括CommonsMultipartResolver解析器和MultipartFile接口。开发者可以通过表单的enctype属性设置为"multipart/form-data",然后在控制器中接收并处理上传...

    spring mvc 多附件上传

    此外,为了确保文件上传的安全性和稳定性,我们可能还需要配置Spring MVC的MultipartResolver,比如使用`CommonsMultipartResolver`,设置最大文件大小和总的上传大小限制。这可以在Spring的配置文件中完成: ```...

    springmvc01.zip_DEMO_JSON校验_spring mvc

    - 探索Spring MVC的高级特性,如拦截器、AOP、异常处理等。 通过这个DEMO,你可以亲手实践上述知识点,加深对Spring MVC的理解,并逐步掌握实际开发中的应用技巧。在实践中遇到问题,可以查阅官方文档、在线教程或...

    spring mvc配置演示源码

    5. **异常处理** - Spring MVC允许自定义异常处理器,通过`@ControllerAdvice`和`@ExceptionHandler`注解全局处理特定类型的异常。 6. **上传下载支持** - 使用`@RequestParam("file") MultipartFile file`接收...

    springmvc上传文件所需jar包

    1. **配置Spring MVC**:在Spring的配置文件中,你需要配置一个`MultipartResolver`,例如`CommonsMultipartResolver`,指定允许的最大文件大小和总上传大小。 2. **创建Controller**:创建一个处理文件上传请求的...

Global site tag (gtag.js) - Google Analytics