文件上传
1.MultipartResolver接口
1)用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作
2)两个实现类
StandardServletMultipartResolver
使用了Servlet3.0标准的上传方式
CommonsMultipartResolver
使用了Apache的commons-fileupload来完成具体的上传操作
2. 使用 CommonsMultipartResolver实现单文件上传
第一步:导入jar
commons-io-2.4.jar
commons-fileupload-1.2.2.jar
第二步:配置文件(springmvc.xml)
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="5000000"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
第三步:表单页面
method="POST"
enctype="multipart/form-data"
指定表单内容类型,支持文件上传
<input type="file" name="a_idPicPath"/>
用来上传文件的file组件
第四步:实现controller(多文件上传)
例:public String add(@Valid User user,BindingResult bindingResult,HttpServletRequest request,
@RequestParam(value="a_idPicPath",required = false) MultipartFile[] attachs){
for(int i=0;i<attachs.length;i++){
//操作图片
if(!attachs[i].isEmpty()){
//1.找到目录
String path = request.getSession()
.getServletContext()
.getRealPath("statics"+File.separator+"uploadfiles");
//2.创建文件
//2.1 原来文件名
String oldName = attachs[i].getOriginalFilename();
String suffix = FilenameUtils.getExtension(oldName);
//2.2 取名字
String fileName = System.currentTimeMillis()+"_user."+suffix;
File targetFile = new File(path,fileName);
//把图片放到指定的目录
try {
attachs[i].transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
request.setAttribute("uploadError", "上传失败");
return "useradd";
}
//设置数据库值
if(i==0){
user.setIdPicPath(path+File.separator+fileName);
}
if(i==1){
user.setWorkPicPath(path+File.separator+fileName);
}
}
}
user.setCreationDate(new Date());
user.setCreatedBy(((User)request.getSession().getAttribute(Constants.USER_SESSION)).getId());
if(userService.add(user)){
return "redirect:query";
}else{
return "useradd";
}
}
注意:a)MultipartFile
Spring MVC会将上传文件绑定到MultipartFile对象中,并通过该对象完成文件的上传操作提供的方法
b)File.separator
Windows、Linux自适应路径分隔符
低入侵性的代码实现
c)必须对上传文件进行重命名
原因
原文件名存在中文 乱码问题
原文件名与服务器上已有文件重名 覆盖问题
重新定义上传文件名(保证不重名)
当前系统时间+随机数+“_Personal.jpg”
d)文件上传成功后,须更新数据库字段(idPicPath),记录上传文件的存储路径
3. 多文件上传(基本同上)
1)上传文件的组件名一致,以数组的形式传递给控制器的处理方法
<label for="a_idPicPath">证件照:</label>
<input type="file" name="attachs" id="a_idPicPath"/>
<label for="a_workPicPath">工作证照片:</label>
<input type="file" name="attachs" id="a_workPicPath"/>
2) 控制器-处理方法addUserSave()
修改入参MultipartFile为数组
MultipartFile[] attachs
MultipartFile[] 数组内存放文件对象顺序
按照form表单的file标签的顺序进行存储
分别更新字段:idPicPath、workPicPath
注意:若入参对象MultipartFile为数组时,
该参数前面必须要加上@RequestParam注解,否则会报错