SpringMVC⽂件上传⼤⼩和类型限制以及超⼤⽂件上传bug问题
在上⼀篇⽂章中,主要介绍了Spirng MVC环境下的正常情况下⽂件上传功能实现。在实际开发的时候,还会涉及到上传⽂件⼤⼩和类型的限制,接下来就会对Spirng MVC环境下⽂件上传⼤⼩和类型的限制进⾏介绍,还会讲解到⽂件上传⼤⼩tomcat服务器bug问题及解决⽅案。
⼀、⽂件上传⼤⼩限制
这⾥还是接着上篇⽂章先介绍Spring MVC下的⽂件上传⼤⼩限制,⽂件上传⼤⼩的限制在l中配置⽂件解析器CommonsMultipartResolver时即可配置,⽰例如下:
<!-- 配置⽂件上传类型解析器 multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipartmons.CommonsMultipartResolver">
<!-- 设置上传⽂件最⼤尺⼨,单位为B -->
<property name="maxUploadSize" value="5242880" />
</bean>
关于Spring MVC中⽂件上传⼤⼩的限制就这么简单,问题是Spring MVC并没有像Struts2那样的配置,如果单纯配置⼀个限制⽂件上传⼤⼩的配置,当超过上传限制后就会出现异常:
所以当在⽂件解析器中配置了⽂件⼤⼩的限制后,必须将抛出的MaxUploadSizeExceededException(上传⽂件过⼤异常)进⾏接收并跳转。关于异常接收,在Spring MVC官⽅⽂档中介绍了有3种⽅法,这⾥主要介绍其中2种:
(1)直接在配置⽂件l中使⽤Spring MVC提供的SimpleMappingExceptionResolver(异常解析映射器)来接收异常信息:
<!-- 1.在⽂件上传解析时发现异常,此时还没有进⼊到Controller⽅法中 -->
<bean id="exceptionResolver" class= "org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<!-- 遇到MaxUploadSizeExceededException异常时,跳转到error.jsp页⾯ -->
<prop key= "org.springframework.web.multipart.MaxUploadSizeExceededException">/error </prop>
</props>
</property>
</bean>
这样当再出现⽂件上传⼤⼩的异常时,配置⽂件会⾃动捕获异常并进⾏匹配,匹配到对应的MaxUploadSizeExceededException异常,就跳转到指定的error.jsp错误页⾯。
(2)另⼀种就是⾃定义⼀个异常处理器类,可以匹配接收各种异常,同时可以指定跳转页⾯以及错误提⽰信息:
/**
* ⾃定义异常处理器类
*/
public class ExceptionHandler implements HandlerExceptionResolver{
/**
* 处理上传⽂件⼤⼩超过限制抛出的异常
*/
@Override
public ModelAndView resolveException(HttpServletRequest req,
HttpServletResponse res, Object ob,Exception ex) {
ModelAndView mv=new ModelAndView();
//判断异常类型,来跳转不同页⾯
if (ex instanceof MaxUploadSizeExceededException){
//指定错误信息
mv.addObject("errormessage", "上传⽂件过⼤");
//设置跳转视图
mv.setViewName("userEdit");
return mv;
}
//其他异常
return null;
}
}
上⾯⾃定的异常处理器类,模拟接收了抛出的MaxUploadSizeExceededException异常,完成⾃定义异常处理器类后,还必须进⾏在l配置⽂件中配置:
<!-- 2.配置⾃定义异常处理器类 -->
<bean class="ption.ExceptionHandler" />
上⾯就介绍完了2种主要的Spring MVC中⽂件上传⼤⼩限制及异常捕获的⽅案,读者可以⾃⾏测试。
补充:⽂件上传⼤⼩限制tomcat服务器bug问题
在使⽤上述2种⽂件上传⼤⼩限制及异常捕获配置后,当上传⽂件⼤⼩超过限制⼀定范围后,可以正确捕获异常并且跳转到指定页⾯,但是当上传⽂件超⼤(严重超出上传⼤⼩限制)时,就可能出现关于MaxUploadSizeExceededException 死循环状态,此时页⾯直接崩溃。
所以针对Spring MVC⽂件上传⼤⼩限制出现的这个问题,可以换⽤tomcat7.0.39版本的tomcat服务器;或者使⽤另⼀种思路。
⽬前可⾏的解决⽅案:
⾸先在配置⽂件解析器时,不使⽤Spring MVC提供的⽂件上传⼤⼩限制属性<property name="maxUploadSize" value="5242880" />,⽰例如下:
<!-- 配置⽂件上传类型解析器 multipartResolver-->
<bean id="multipartResolver" class="org.springframework.web.multipartmons.CommonsMultipartResolver" />
然后⾃定义⼀个来限定⽂件上传⼤⼩,并模拟抛出MaxUploadSizeExceededException异常:
public class FileUploadInterceptor extends HandlerInterceptorAdapter {
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) {
//当上传⽂件⼤⼩超过指定⼤⼩限制后,模拟抛出MaxUploadSizeExceededException异常
throw new MaxUploadSizeExceededException(maxSize);
}
}
return true;
springmvc选择题}
public void setMaxSize(long maxSize) {
this.maxSize = maxSize;
}
}
最后在l中配置拦截上传⼤⼩限制的:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.itheima.interceptor.FileUploadInterceptor">
<!-- 设定限制的⽂件上传⼤⼩ -->
<property name="maxSize" value="5242880"/>
</bean>
</mvc:interceptor>
</mvc:interceptors>
这样就可以完成在Spring MVC环境下⽂件上传⼤⼩的限制以及异常正确捕获了。
⼆、⽂件上传类型的限制
在这⾥讲解之前必须要声明的是,在Spring MVC配置下,并没有像Struts2配置⽂件中那样配置⼀个就可以同时限定上传⽂件⼤⼩和类型。同时在官⽅⽂档以及其相关资料中也没有提出在Spring MVC环境中限制⽂件上传类型的解决⽅案,不过这⾥我们仍然可以使⽤⾃定义来限制⽂件上传类型。
⾸先⾃定义⼀个⽂件上传类型限制的,⽰例如下:
/**
* 全局⽂件类型
*/
public class FileTypeInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)throws Exception {
boolean flag= true;
// 判断是否为⽂件上传请求
if (request instanceof MultipartHttpServletRequest) {
MultipartHttpServletRequest multipartRequest =
(MultipartHttpServletRequest) request;
Map<String, MultipartFile> files =
Iterator<String> iterator = files.keySet().iterator();
//对多部件请求资源进⾏遍历
while (iterator.hasNext()) {
String formKey = (String) ();
MultipartFile multipartFile =
String OriginalFilename();
//判断是否为限制⽂件类型
if (! checkFile(filename)) {
//限制⽂件类型,请求转发到原始请求页⾯,并携带错误提⽰信息
request.setAttribute("errormessage", "不⽀持的⽂件类型!");
.forward(request, response);
flag= false;
}
}
}
return flag;
}
/**
* 判断是否为允许的上传⽂件类型,true表⽰允许
*/
private boolean checkFile(String fileName) {
//设置允许上传⽂件类型
String suffixList = "jpg,gif,png,ico,bmp,jpeg";
// 获取⽂件后缀
String suffix = fileName.substring(fileName.lastIndexOf(".")
+ 1, fileName.length());
if (im().toLowerCase())) {
return true;
}
return false;
}
}
在上述⽰例中,⾃定义的限制了⽂件上传类型为:String suffixList = "jpg,gif,png,ico,bmp,jpeg";当拦截成功后会重回远请求页⾯,并携带错误信息。
然后在l中配置⾃定义,⽰例如下:
<mvc:interceptors>
<!-- 如果有多个,则按照顺序进⾏配置 -->
  <mvc:interceptor>
<!-- /**表⽰所有URL和⼦URL路径 -->
<mvc:mapping path="/**" />
<!-- 配置⾃定义的⽂件上传类型限制 -->
<bean class="com.itheima.interceptor.FileTypeInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

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