Spring框架之SpringMVC(5.0)
文件上传
在SpringMVC里面使用的上传组件依然是ApacheFileuplode组件,但是如果要进行上传,不再使用的是file类对象了,而是一个Spring包装好的对象。
在Spring中提供 一个类:
org.springframework.web.multipart.commons.CommonsMultipartFile
进行上传的配置:
org.springframework.web.multipart.commons.CommonsMultipartResolver
1,修改appliacationContext.xml文件:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置了上传文件的最大容量 -->
<property name="maxUploadSize" value="524288000"/>
<!-- 设置上传操作使用的最大内存数量 -->
<property name="maxInMemorySize" value="2097152"/>
</bean>
2,定义action实现上传:
package cn.mldn.action;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import cn.mldn.vo.Emp;
@Controller
@RequestMapping("/pages/back/emp/*")
// 此处描述的是定义父路径
public class EmpAction { // 完全是一个独立的类
@RequestMapping(value = "upload")
public ModelAndView addUpload(Emp emp, MultipartFile photo,
HttpServletRequest request) {
System.out.println(emp);
String fileExt = null ;
System.out.println("********************** " + photo.getContentType());
if ("image/jpg".equals(photo.getContentType())) {
fileExt = "jpg" ;
}
String outFilePath = request.getServletContext()
.getRealPath("/upload/") + UUID.randomUUID() + "." + fileExt;
try {
photo.transferTo(new File(outFilePath));
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
3,定义一个表单:
<body>
<form action="<%=basePath%>pages/back/emp/upload.action" method="post" enctype="multipart/form-data">
雇员姓名:<input type="text" name="ename" id="ename"><br>
部门名称:<input type="text" name="dept.dname" id="dept.dname"><br>
雇员照片:<input type="file" name="photo" id="photo"><br>
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
发现出错了:少了一个commoms.io包:
如果超过了设置的大小怎么办:会出现如下的错误提示:
MaxUploadSizeExceededException
最好的做法是将其保存在错误页上:
a,修改applicationContext.xml文件:
<bean id="exceptionMapping" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">
/errors.jsp
</prop>
</props>
</property>
</bean>
b,在根目录上增加errors.jsp:
<body>
出错啦!
</body>
运行结果:
如果项目里面增加了安全带WEB应用,那么此处只能写上文件名称:
方案一:将errors.jsp 页面拷贝到WEB-INF/pages目录中,同时将跳转的页面设置
为“errors".
方案二:删除WEB安全配置。
当上传的图片超过了Tomcat分配给WEB程序的极限。如果要想解决这个问题已经不能够去修改Spring MVC的配置了;
1,需要打开解析的延迟处理:
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置了上传文件的最大容量 -->
<property name="maxUploadSize" value="524288000"/>
<!-- 设置上传操作使用的最大内存数量 -->
<property name="maxInMemorySize" value="2097152"/>
<property name="resolveLazily" value="true"/>*
</bean>
出错之后交给一个专门错误处理操作完成。
范例:在EmpAction类中定义一个专门的错误处理方法:
package cn.mldn.action;
import java.io.File;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
import cn.mldn.vo.Emp;
@Controller
@RequestMapping("/pages/back/emp/*")
// 此处描述的是定义父路径
public class EmpAction { // 完全是一个独立的类
@RequestMapping(value = "upload")
public ModelAndView addUpload(Emp emp, MultipartFile photo,
HttpServletRequest request) {
System.out.println(emp);
String fileExt = null ;
System.out.println("********************** " + photo.getContentType());
if ("image/jpg".equals(photo.getContentType())) {
fileExt = "jpg" ;
}
String outFilePath = request.getServletContext()
.getRealPath("/upload/") + UUID.randomUUID() + "." + fileExt;
try {
photo.transferTo(new File(outFilePath));
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
@ExceptionHandler
public String exceptionHandle(Exception e) { // 专门处理异常
if (e instanceof MaxUploadSizeExceededException) { // 现在超过了最大的上传文件大小
System.out.println("**** 进行一些错误的记录处理操作 *******");
}
return "/errors.jsp" ;
}
}
范例:修改Tomcat文件
修改%TOMCAT_HOME/conf/server.xml文件
<Connector connection Timeout=:"20000" port="80" protocol="HTTP/1.1" redirectPort="8443"
maxSwallowSize="-1"/>
此时不对操作进行任何限制;