2018年2月2日
功能:实现数据与文件同时提交;
【0】之前的博文:《SpringMVC(23):使用springmvc+spring+jdbc 优化订单管理系统的示例(单文件上传功能的实现)》,提到没有完成数据与文件同时提交的功能,例子如下:
<h4>这是用户添加页面,请在下方输入新的用户信息:</h4>
method="post" modelAttribute="user"
action="${pageContext.request.contextPath}/user/useraddsave"
enctype="multpart/form-data">
<fm:errors path="userCode"></fm:errors>
用户编码 :<fm:input path="userCode" /><br/>
<fm:errors path="userName"></fm:errors>
用户名称 :<fm:input path="userName"/><br/>
<fm:errors path="userPassword"></fm:errors>
用户密码 :<fm:password path="userPassword"/><br>
用户地址 :<fm:input path="address" /><br>
用户电话 : <fm:input path="phone"/><br>
<fm:errors path="birthday"></fm:errors>
用户生日 :<fm:input path="birthday" /><br>
用户性别: <fm:radiobutton path="gender" value="1"/>女
<fm:radiobutton path="gender" value="2"/>男<br>
用户角色 :<br>
<fm:radiobutton path="userRole" value="101" />OrdinaryUser
<fm:radiobutton path="userRole" value="110"/>Administrator<br>
<fm:radiobutton path="userRole" value="111"/>Manager
<fm:radiobutton path="userRole" value="100"/>tour<br>
证件照: <input type="file" name="a_idPicPath" id="a_idPicPath" />
<input type="submit" name="保存"/>
<input type="reset" value="重置"/>
</fm:form>
显示效果:
图1
经过研究,已经解决了该问题:之前不能将数据与文件同时上传,原因是使用了spring提供的标签库,并且在页面<fm:form>标签设置了modelAttribute="user" ,即绑定了模型数据,由此不能识别文件类型数据。
下面分别讲授单文件和多文件与数据模型同时传递的实例:
【1】单文件与数据模型同时传递
View层:
<h5>以下为单文件+其他数据测试</h5>
<form action="${pageContext.request.contextPath }/user/upload" method="post" enctype="multipart/form-data">
用户编码 :<input type="text" name="userCode" value=""/><br>
用户名称 :<input type="text" name="userName" value=""/><br>
用户密码 :<input type="text" name="userPassword" value=""/><br>
用户地址 :<input type="text" name="address" value=""/> <br>
用户电话 : <input type="text" name="phone" value=""/><br>
用户生日 :<input type="text" name="birthday" value=""/><br>
用户性别: <select name="gender" id="gender">
<option value="1">女</option>
<option value="2" selected="selected">男</option>
</select><br>
用户角色 :<select name="userRole" id="userRole">
<option value="100" selected="selected">tour</option>
<option value="101">OrdinaryUser</option>
<option value="110">Administrator</option>
<option value="111">Manager</option>
</select><br>
<input type="hidden" id="errorinfo" value="${uploadFileError}">
上传文件:<input type="file" name="uploadFile"/><br/><br/>
<input type="submit" value="上传"/>
<input type="reset" value="重置"/>
</form>
Controller层:
@RequestMapping(value="/upload" ,method=RequestMethod.POST)
public String test(User user,HttpSession session ,HttpServletRequest request,
@RequestParam(value="uploadFile",required=false) MultipartFile uploadFile) throws Exception, IOException{
System.out.println("test==");
String idPicPath = null;
if(!(uploadFile.isEmpty())){
System.out.println("begin attaching...");
//获取保存文件的绝对路径
String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
System.out.println("2.1 uploadFile path ===>"+path);
//获取上传文件的文件名
String oldFileName = uploadFile.getOriginalFilename();//原文件名
System.out.println("2.2 uploadFile oldFileName ===>"+oldFileName);
//获取文件名后缀
String prefix = FilenameUtils.getExtension(oldFileName);//原文件名后缀
System.out.println("2.3 uploadFile prefix ===>"+prefix);
//设置文件大小的变量,KB是单位
int filesize = 5000000;
System.out.println("2.4 uploadFile filesize ===>"+uploadFile.getSize());
if(uploadFile.getSize() > filesize){
request.setAttribute("uploadFileError", "* 上传大小不得超过5000KB");
System.out.println("* 上传大小不得超过5000KB");
return "useradd";
}else if(prefix.equalsIgnoreCase("jpg")
|| prefix.equalsIgnoreCase("png")
|| prefix.equalsIgnoreCase("jpeg")
|| prefix.equalsIgnoreCase("pneg")){
//上传格式正确,重命名文件
String fileName = System.currentTimeMillis()+RandomUtils.nextInt(1000000)+"_Personal.jpg";
System.out.println("2.5 new fileName===>"+uploadFile.getName());
//新建这么一个文件,File API
File targetFile = new File(path,fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
//保存
try{
//上传
uploadFile.transferTo(targetFile);
}catch (Exception e){
e.printStackTrace();
request.setAttribute("uploadFileError", "* 上传失败! ");
System.out.println("* 上传失败! ");
return "useradd";
}
idPicPath = path+File.separator+fileName;
}else{
request.setAttribute("uploadFileError", "* 上传格式错误!");
System.out.println("* 上传格式错误!");
return "useradd";
}
}
System.out.println("user.idPicPath: "+ user.getIdPicPath());
user.setIdPicPath(idPicPath);
System.out.println("user is: "+user.toString());
return "userlist";
}
在springmvc配置文件注册MultipartResolver:
<!-- 配置MultipartResolver -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"></property>
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
测试结果:
测试输入:
图2
打印日志:
test==
begin attaching...
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
2.2 uploadFile oldFileName ===>a.jpg
2.3 uploadFile prefix ===>jpg
2.4 uploadFile filesize ===>2345446
2.5 new fileName===>uploadFile
user.idPicPath: null
user is: User [id=null, userCode=test07, userName=mmb08, userPassword=scua, gender=2, birthdayString=null, birthday=Fri Jul 01 00:00:00 CST 1994, phone=1885454522, address=jiangsu, userRole=100, createdBy=null, creationDate=null, creationDateString=null, modifyBy=null, modifyDate=null, modifyDateString=null, idPicPath=D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517581833771_Personal.jpg, workPicPath=null, roleName=null]
文件上传:
图3 上传的文件
【2】多文件与数据模型同时传递
View层:
<h5>以下为上传多文件+其他数据测试</h5>
<form action="${pageContext.request.contextPath }/user/uploadb" method="post" enctype="multipart/form-data">
用户编码 :<input type="text" name="userCode" value=""/><br>
用户名称 :<input type="text" name="userName" value=""/><br>
用户密码 :<input type="text" name="userPassword" value=""/><br>
用户地址 :<input type="text" name="address" value=""/> <br>
用户电话 : <input type="text" name="phone" value=""/><br>
用户生日 :<input type="text" name="birthday" value=""/><br>
用户性别: <select name="gender" id="gender">
<option value="1">女</option>
<option value="2" selected="selected">男</option>
</select><br>
用户角色 :<select name="userRole" id="userRole">
<option value="100" selected="selected">tour</option>
<option value="101">OrdinaryUser</option>
<option value="110">Administrator</option>
<option value="111">Manager</option>
</select><br>
<div>
<input type="hidden" id="errorinfo" value="${uploadFileError}">
文件1:<input type="file" name="uploadFiles"/><br/><br/>
</div>
<div>
<input type="hidden" id="errorinfo" value="${uploadFileError}">
文件2:<input type="file" name="uploadFiles"/><br/><br/>
</div>
<input type="submit" value="上传"/>
</form>
Controller层:
@RequestMapping(value="/uploadb",method=RequestMethod.POST)
public String test2(User user,HttpSession session,
HttpServletRequest request,
@RequestParam(value="uploadFiles",required=false)MultipartFile[] uploadFiles) throws SQLException{
String errorInfo = null;
String idPicPath = null;
String workPicPath = null;
boolean flag = true;
//获取保存文件的绝对路径
String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
System.out.println("2.1 uploadFile path ===>"+path);
for(int i=0;i<uploadFiles.length;i++){
MultipartFile uploadFile = uploadFiles[i];
System.out.println("开始-flag: "+flag);
if(!uploadFile.isEmpty()){
if(i==0){
errorInfo = "uploadFileError!";
}else if(i==1){
errorInfo = "uploadWpError!";
}
System.out.println("文件数量-flag: "+flag);
String oldFileName = uploadFile.getOriginalFilename();
String prefix = FilenameUtils.getExtension(oldFileName);
int filesize = 500000;
if(uploadFile.getSize() > filesize){
request.setAttribute("uploadFileError", "* 上传大小不得超过5000KB");
System.out.println("* 上传大小不得超过5000KB");
flag = false;
System.out.println("文件大小-flag: "+flag);
return "useradd";
}else if(prefix.equalsIgnoreCase("jpg")
|| prefix.equalsIgnoreCase("png")
|| prefix.equalsIgnoreCase("jpeg")
|| prefix.equalsIgnoreCase("pneg")){
//上传格式正确,重命名文件
String fileName = System.currentTimeMillis()+RandomUtils.nextInt(1000000)+"_Personal.jpg";
System.out.println("2.2 new fileName===>"+uploadFile.getName());
//新建这么一个文件,FILE API
File targetFile = new File(path,fileName);
if(!targetFile.exists()){
targetFile.mkdirs();
}
System.out.println("格式-flag: "+flag);
//保存
try{
//上传
uploadFile.transferTo(targetFile);
}catch (Exception e){
e.printStackTrace();
request.setAttribute("uploadFileError", "* 上传失败! ");
System.out.println("* 上传失败! ");
flag = false;
System.out.println("上传-flag: "+flag);
return "useradd";
}
if(i==0){
idPicPath = path+File.separator+fileName;
log.info("2.3 idPicPath==>"+idPicPath);
}else if(i==1){
workPicPath = path+File.separator+fileName;
log.info("2.4 workPicPath==>"+workPicPath);
}
}else{
request.setAttribute("uploadFileError", "* 上传格式错误!");
System.out.println("* 上传格式错误!");
flag = false;
return "useradd";
}
}
}
System.out.println("flag:"+flag);
if(flag){
System.out.println("user.idPicPath: "+ user.getIdPicPath());
user.setIdPicPath(idPicPath);
System.out.println("user is: "+user.toString());
}
return "useradd";
}
测试结果:
测试输入:
图4
打印日志:
test==
begin attaching...
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
2.2 uploadFile oldFileName ===>a.jpg
2.3 uploadFile prefix ===>jpg
2.4 uploadFile filesize ===>2345446
2.5 new fileName===>uploadFile
user.idPicPath: null
user is: User [id=null, userCode=test07, userName=mmb08, userPassword=scua, gender=2, birthdayString=null, birthday=Fri Jul 01 00:00:00 CST 1994, phone=1885454522, address=jiangsu, userRole=100, createdBy=null, creationDate=null, creationDateString=null, modifyBy=null, modifyDate=null, modifyDateString=null, idPicPath=D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517581833771_Personal.jpg, workPicPath=null, roleName=null]
2.1 uploadFile path ===>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles
开始-flag: true
文件数量-flag: true
2.2 new fileName===>uploadFiles
格式-flag: true
18/02/02 22:39:10 INFO Controller.UserController: 2.3 idPicPath==>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517583031535_Personal.jpg
开始-flag: true
文件数量-flag: true
2.2 new fileName===>uploadFiles
格式-flag: true
18/02/02 22:39:10 INFO Controller.UserController: 2.4 workPicPath==>D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517582509250_Personal.jpg
flag:true
user.idPicPath: null
user is: User [id=null, userCode=test07, userName=mmb08, userPassword=scua, gender=2, birthdayString=null, birthday=Fri Jul 01 00:00:00 CST 1994, phone=123456, address=jiangsu, userRole=100, createdBy=null, creationDate=null, creationDateString=null, modifyBy=null, modifyDate=null, modifyDateString=null, idPicPath=D:\java_ee_eclipse\mmb_workplace\.metadata\.plugins\org.eclipse.wst.server.core\tmp4\wtpwebapps\springmvc5\statics\uploadfiles\1517583031535_Personal.jpg, workPicPath=null, roleName=null]
文件上传:
图5