近期已经上线的项目出现了一个异常
严重: 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框架中,文件上传和下载是常见的功能需求,特别是在构建Web应用程序时。这个压缩包文件"Spring MVC 文件上传下载 后端 - Java.zip"包含的文档可能详细阐述了如何在Java后端实现这些功能。以下是关于...
为了使Spring MVC能够处理文件上传,需要在配置中添加`MultipartResolver`。在XML配置中,我们可以使用`CommonsMultipartResolver`: ```xml <bean id="multipartResolver" class="org.springframework.web....
该方法通常接收一个`MultipartFile`类型的参数,这是Spring MVC为处理上传文件提供的特殊类型。示例代码如下: ```java @Controller public class UploadController { @RequestMapping(value = "/upload", ...
实际应用中,你可能还需要考虑其他因素,比如文件大小限制、文件类型检查、异常处理、安全性(防止路径遍历攻击)等。通过这些方法,你可以构建一个完整的文件管理系统,满足用户对文件上传和下载的需求。
综上所述,Spring MVC提供了方便的API来处理文件上传,包括配置、表单创建、控制器编写、文件处理和异常处理等步骤。通过了解和实践这些知识点,开发者可以更好地在实际项目中实现文件上传功能。同时,对于源码的...
总结来说,Spring MVC中的文件上传涉及配置`CommonsMultipartResolver`,创建处理文件上传的控制器,以及在前端创建适当的表单元素。通过`MultipartFile`接口,我们可以方便地访问上传文件的信息并将其保存到服务器...
3. **异常处理**:当上传的文件大小超过了配置的最大值时,Spring MVC会抛出`MaxUploadSizeExceededException`异常。可以通过配置异常处理器来处理这种情况,并跳转到特定的错误页面。 ```xml ...
文件上传通常使用了Spring MVC的`CommonsMultipartResolver`,这是一个多部分解析器,能处理HTTP请求中的multipart/form-data类型,支持文件上传。下载则通过设置响应头的Content-Disposition属性,指导浏览器以...
- 需要注意文件大小限制和异常处理,避免文件过大导致内存溢出或非法文件类型引发安全问题。 7. **配置文件上传** 在Spring MVC的配置中,需要设置最大上传文件大小和总请求大小,例如: ```xml ...
在Spring MVC框架中,文件上传是一项常见的功能,但同时也需要考虑...总的来说,Spring MVC提供了灵活的机制来处理文件上传的大小和类型限制,以及异常处理。通过适当的配置和编程,可以确保文件上传操作既安全又高效。
在开发Web应用时,文件...在实际项目中,你可能还需要考虑异常处理、事务管理以及安全性问题,比如防止恶意文件上传、限制上传速率等。通过Spring MVC和Mybatis的组合,我们可以构建出高效且易于维护的文件上传功能。
在Spring MVC的配置文件(如`dispatcher-servlet.xml`)中,我们需要配置一个`MultipartResolver`,通常是`CommonsMultipartResolver`,这样Spring MVC才能处理多部分表单数据,即文件上传。 5. **控制器...
为了处理文件上传,我们需要在Spring MVC的配置文件(如`spring-mvc.xml`)中添加MultipartResolver,例如使用`CommonsMultipartResolver`: ```xml <bean id="multipartResolver" class="org.springframework.web....
`MultipartFile`是Spring MVC用于处理上传文件的接口。它提供了一些常用方法,如: - `getBytes()`:获取文件的字节数组。 - `getContentType()`:获取文件的MIME类型。 - `getInputStream()`:获取文件的输入流。 -...
4. **文件上传**:Spring MVC提供了一套处理文件上传的API,包括CommonsMultipartResolver解析器和MultipartFile接口。开发者可以通过表单的enctype属性设置为"multipart/form-data",然后在控制器中接收并处理上传...
此外,为了确保文件上传的安全性和稳定性,我们可能还需要配置Spring MVC的MultipartResolver,比如使用`CommonsMultipartResolver`,设置最大文件大小和总的上传大小限制。这可以在Spring的配置文件中完成: ```...
- 探索Spring MVC的高级特性,如拦截器、AOP、异常处理等。 通过这个DEMO,你可以亲手实践上述知识点,加深对Spring MVC的理解,并逐步掌握实际开发中的应用技巧。在实践中遇到问题,可以查阅官方文档、在线教程或...
5. **异常处理** - Spring MVC允许自定义异常处理器,通过`@ControllerAdvice`和`@ExceptionHandler`注解全局处理特定类型的异常。 6. **上传下载支持** - 使用`@RequestParam("file") MultipartFile file`接收...
1. **配置Spring MVC**:在Spring的配置文件中,你需要配置一个`MultipartResolver`,例如`CommonsMultipartResolver`,指定允许的最大文件大小和总上传大小。 2. **创建Controller**:创建一个处理文件上传请求的...