springMVC⽂件上传⼤⼩超过限制的问题
springMVC是⼀个⾮常⽅便的web层框架,我们使⽤它的⽂件上传也⾮常的⽅便。
我们通过下⾯的配置来使⽤springMVC⽂件上传功能。
<bean id="multipartResolver" class="ller.fileupload.MultipartListenerResolver">
<!-- 设置上传⽂件的最⼤尺⼨为10M -->
<property name="maxUploadSize" value="10240"/>
<property name="maxInMemorySize" value="4096"/>
<property name="defaultEncoding" value="UTF-8"/>
<property name="resolveLazily" value="true"/>
</bean>
Controller层我们这样接收⽂件
@RequestMapping("fileUpload")
public void fileUpload(@RequestParam("myFile") MultipartFile multipartFile) throws Exception{
String fileName =  OriginalFilename();
File f = createFile(fileName);
}
页⾯上记得指定enctype属性哦
<form method="post" enctype="multipart/form-data"></form>
如果你的springMVC配置是正确的,那么到此springMVC的⽂件上传功能已经可以⽤了。⼀切都很完美。
由于我们配置了maxUploadSize属性,那么如果我们的⽂件超过了10M会出现什么情况呢?
理论上系统会抛出MaxUploadSizeExceededException异常,那么如何处理呢?
springMVC异常处理的配置⽅式如下:
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">redirect:/error.jsp</prop>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">redirect:/MaxUploadSizeError.jsp</prop>
</props>
</property>
<property name="defaultErrorView" value="redirect:/error.jsp"></property>
<property name="defaultStatusCode" value="500"></property>
</bean>
上⾯的配置作⽤是如果系统抛出MaxUploadSizeExceededException异常,系统跳转到MaxUploadSizeError.jsp页⾯给⽤户以提⽰。
如果是其他Exception异常,则跳转到error.jsp页⾯。
接下来我们测试⼀下上⾯的异常处理是否⽣效了。
在你的代码任意地⽅试着抛出NullPointException异常,发现页⾯的确能跳转到error.jsp,证明我们的异常处理是⽣效的。
然后我们上传⼀个10M以上的⽂件,我们发现后台控制台抛出了MaxUploadSizeExceededException异常,我们期待着页⾯转向到MaxUploadSizeError.jsp。
但是很遗憾,页⾯并没有跳转,页⾯出现了这个
why? why? 你搜遍⽹上的相关配置,发现就是这么配置的不会错,但就是不!⽣!效!why!why!why!
我也是被这个问题坑了很久,经过多次搜索、研究,总算得出了⼀个让⾃⼰满意的结果。
想想⽹上那些关于springMVC⽂件上传⽂件过⼤时捕获异常的配置,我⼼⾥想说,你们的配置真的⽣效吗?到底咋⽣效的??我的咋就不⽣效呢
spring framework是什么框架的
事实上只要你使⽤apache-tomcat-7.0.39这个版本的tomcat,上⾯的配置就是正确的,
如果是其他版本的tomcat,那么就会出现上⾯说的ERR_CONNECTION_RESET的问题。
我试了其他版本的tomcat和tomcat-8.0.32,都会出现以上问题。
所以你可以来解决这个问题。但显然这不是⼀个好的解决⽅案。
还有⼀个相对完美的解决⽅案就是使⽤sprngMVC。
1.更改你的MultipartListenerResolver的maxUploadSize属性,使其尽量⼤,避免上传⽂件时异常被springMVC框架抛出
2.在l⽂件中加⼊配置,如下:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="ller.fileupload.FileUploadInterceptor">
<!-- 1M -->
<property name="maxSize" value="1048576"/>
</bean>
</mvc:interceptor>
</mvc:interceptors>
注意这⾥的maxSize才是允许上传的最⼤⽂件⼤⼩。 FileUploadInterceptor.java代码如下
public class FileUploadInterceptor implements HandlerInterceptor {
private long maxSize;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if(request!=null && ServletFileUpload.isMultipartContent(request)) {
ServletRequestContext ctx = new ServletRequestContext(request);
long requestSize = tLength();
if (requestSize > maxSize) {
throw new MaxUploadSizeExceededException(maxSize);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {    }
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
public void setMaxSize(long maxSize) {
this.maxSize = maxSize;
}
}
到此为⽌,springMVC限制⽂件上传⼤⼩的问题就介绍完了。另介绍⼀个js判断上传⽂件⼤⼩的⽅法
function checkFileSize(eleId) {
var allowSize = 10*1024*1024;// 10M
var size = $("#" + eleId)[0].files[0].size;
if (size > allowSize) {
alert("⽂件⼤⼩限制在10M以内");
return false;
}
return true;
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。