实现文件上传
导入jar文件
commons-io-2.4.jar、commons-fileupload-1.2.2.jar、commons-lang-2.6.jar
MultipartResolver接口
用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作
MultipartResolver接口有两个实现类
StandardServletMultipartResolver:使用了Servlet3.0标准的上传方式
CommonsMultipartResolver:使用了Apache的commons-fileupload来完成具体的上传操作
文件上传的步骤:
- 导入jar包
- 配置MultipartResolver (springmvc-servlet.xml)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- maxUploadSize上传文件大小上限,单位是子节 -->
<property name="maxUploadSize" value="5000000"/>
<!-- defaultEncoding请求编码格式,默认为ISO-8859-1,此处设置为utf-8 -->
<property name="defaultEncoding" value="utf-8"/>
</bean>
- 编写文件上传表单页面
- 在Controller实现文件上传的方法
单文件上传
@RequestMapping(value="/addsave.html",method=RequestMethod.POST)
public String addUserSave(User user,
HttpSession session,HttpServletRequest request,
@RequestParam(value="a_idPicPath",required=false) MultipartFile attach){
String idPicPath = null;
//判断文件是否我空
if(!attach.isEmpty()){
//定义目标长传路径 (file.separator这个代表系统目录中的间隔符 ,自适应的)
String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
//获取源文件名
String oldFileName = attach.getOriginalFilename();
//获取源文件的后缀
String prefix = FilenameUtils.getExtension(oldFileName);
//获取源文件的大小
int filesize = 500000;
if(attach.getSize() > filesize){
request.setAttribute("uplocadFileError", "*上传大小不得超过500k");
return "useradd.html";
}else if(prefix.equalsIgnoreCase("jpg")
|| prefix.equalsIgnoreCase("jpeg")
|| prefix.equalsIgnoreCase("png")
|| prefix.equalsIgnoreCase("pneg")){
//创建新的文件名(规则:当前系统时间+随机数+"_Personal.jpg")
String fileName = System.currentTimeMillis() + RandomUtils.nextInt(1000000) + "_Personal.jpg";
//创建一个新的File对象(传两个参数 目标路径和文件名)
File targetFile = new File(path,fileName);
//判断targetFile是否存在如果不存在则创建
if(!targetFile.exists()){
targetFile.mkdirs();
}
try {
//接收用户上传的文件流
attach.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("uplocadFileError", "*上传失败");
return "useradd.html";
}
idPicPath = path + File.separator + fileName;
}else{
request.setAttribute("uplocadFileError", "*上传图片格式不正确");
return "useradd.html";
}
}
user.setCreatedBy(((User)session.getAttribute("userSession")).getId());
user.setCreationDate(new Date());
user.setIdPicPath(idPicPath);
if(userService.add(user)){
return "redirect:/user/userList.html";
};
return "redirect:/user/useradd";
}
多文件上传
@RequestMapping(value="/addsave.html",method=RequestMethod.POST)
public String addUserSave(User user,
HttpSession session,HttpServletRequest request,
@RequestParam(value="attachs",required=false) MultipartFile[] attachs){
String idPicPath = null;
String workPicPath = null;
boolean flag = true;
//错误信息的提示
String errorInfo = null;
//定义目标长传路径 (file.separator这个代表系统目录中的间隔符 ,自适应的)
String path = request.getSession().getServletContext().getRealPath("statics"+File.separator+"uploadfiles");
for(int i=0; i < attachs.length; i++){
MultipartFile attach = attachs[i];
//判断文件是否我空
if(!attach.isEmpty()){
if(i == 0){
errorInfo = "uplocadFileError";
}if(i == 1){
errorInfo = "uplocadwpError";
}
//获取源文件名
String oldFileName = attach.getOriginalFilename();
//获取源文件的后缀
String prefix = FilenameUtils.getExtension(oldFileName);
//获取源文件的大小
int filesize = 500000;
if(attach.getSize() > filesize){
request.setAttribute(errorInfo, "*上传大小不得超过500k");
flag = false;
}else if(prefix.equalsIgnoreCase("jpg")
|| prefix.equalsIgnoreCase("jpeg")
|| prefix.equalsIgnoreCase("png")
|| prefix.equalsIgnoreCase("pneg")){
//创建新的文件名(规则:当前系统时间+随机数+"_Personal.jpg")
String fileName = System.currentTimeMillis() + RandomUtils.nextInt(1000000) + "_Personal.jpg";
//创建一个新的File对象(传两个参数 目标路径和文件名)
File targetFile = new File(path,fileName);
//判断targetFile是否存在如果不存在则创建
if(!targetFile.exists()){
targetFile.mkdirs();
}
try {
//接收用户上传的文件流
attach.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute(errorInfo, "*上传失败");
flag = false;
}
if(i == 0){
idPicPath = path + File.separator + fileName;
}else if(i == 1){
workPicPath = path + File.separator + fileName;
}
}else{
request.setAttribute(errorInfo, "*上传文件格式不正确");
flag = false;
}
}
}
if(flag){
user.setCreatedBy(((User)session.getAttribute("userSession")).getId());
user.setCreationDate(new Date());
user.setIdPicPath(idPicPath);
user.setWorkPicPath(workPicPath);
if(userService.add(user)){
return "redirect:/user/userList.html";
};
}
return "redirect:/user/useradd";
}>
注意
- File.separator:Windows、Linux自适应路径分隔符、低入侵性的代码实现
- 必须对上传文件进行重命名:
原因:原文件名存在中文会有 乱码问题、原文件名与服务器上已有文件重名 会有覆盖问题
重新定义上传文件名(保证不重名)命名规则:当前系统时间+随机数+“_Personal.jpg” - 文件上传成功后,须更新数据库字段(idPicPath),记录上传文件的存储路径