文主要来总结下SpringMVC中实现单个文件上传的步骤。
本节是在上一节的基础上做的
jar包
SpringMVC上传文件的功能需要两个jar包的支持,主要是CommonsMultipartResolver解析器依赖于这两个jar包:
前台页面
添加jsp页面:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>添加图片</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/stu/addPic" method="post" enctype="multipart/form-data">
添加图片:<input type="file" name="picture"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
注意:form表单中别忘了写enctype="multipart/form-data"属性。
对多部件类型multipart解析
针对上面的enctype=”multipart/form-data”类型,SpringMVC需要对multipart类型的数据进行解析,在springmvc.xml中配置multipart类型解析器即可:
<!-- 配置多媒体文件解析器 -->
<!-- 文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 设置上传文件的最大尺寸为5MB 5*1024*1024B-->
<property name="maxUploadSize">
<value>5242880</value>
</property>
</bean>
创建文件保存的虚拟目录
在上传文件之前,首先要创建一个虚拟目录来保存文件,这个虚拟目录会对应磁盘上的一个实际的目录,在实际开发中肯定会有一个服务器专门存储资源的,在这里我们就用本地磁盘来保存文件,然后映射一个虚拟目录,用来在程序中指定获取文件的路径。
1)新建文件夹来存储图片
在F盘下新建temp/images来存储图片
2)在tomcat配置文件中配置
在tomcat的conf文件夹中的server.xml中配置:
也可以在eclipse中点击tomcat弹出设置,然后在其中创建,这里就不说了
编写Controller
1)跳转到增加图片界面
@RequestMapping("/toAddPic")
public String toAddPic() throws CustomerException{
return "jsp/add_pic";
}
2)编写保存图片的方法
注意:要避免文件名重复!
考虑实际情况,保存图片时一般不只你一个人保存图片,那么这个图片有的时候文件名可能会重复,你保存多了会把原来的图片给覆盖掉,这就不太合适了,所以需要使用UUID算法为每个文件生成一个新的文件名。
SpringMVC文件上传的类是MultipartFile,参数名称picture必须和前台editItem.jsp页面的name属性一致才行。
@RequestMapping("/addPic")
public String addPic(MultipartFile picture) throws IllegalStateException, IOException{
// 处理上传的单个图片
String originalFileName = picture.getOriginalFilename();// 原始名称
//上传图片--首先判断有没有文件上传
if(picture!=null && originalFileName!=null&& originalFileName.length()>0){
// 存储图片的物理路径,实际中是要写到配置文件中的,不能在这写死
String pic_path = "F:\\temp\\images\\";
//新的图片名称
String newFileName = UUID.randomUUID()
+ originalFileName.substring(originalFileName
.lastIndexOf("."));
File newFile = new File(pic_path + newFileName);//新图片
picture.transferTo(newFile);// 将内存中的数据写入磁盘
}
return "jsp/student_list";
}
注意:这个案例只是把图片上传到服务器,实际应用中会将图片的地址以string保存到数据库用于使用。
测试即可