springmvc实现文件上传(以及防止文件重名的操作)
springMVC实现文件上传
注意:
1.文件上传在restful接口里对应的是post的请求
2.演示使用表单上传,表单上传的数据默认是以查询字符串的形式补充到url后,在实现文件上传的时候要修改数据的上传形式
上传view
enctype="multipart/form-data" 将默认的查询字符串形式的数据上传格式修改为多段数据形式进行上传
控制器(需要进行的处理)
1.将上传的多段数据进行封装,借助外部依赖commons-fileupload
1.1依赖引入
commons-fileupload
commons-fileupload
1.3.1
1.2将上传的多段数据进行封装(commons-fileupload + spring ioc完成)
1.2.1 注册CommonsMultipartResolver(多段数据解析器对象)
在ioc中注册封装多段数据的bean(名字是固定的,因为是ioc去访问的,按照名字去找)
1.2.2 转换(封装多段数据)
在dispatcher接受到含有多段数据的request域对象的时候,会去spring的ioc容器当中调用该beans,来完成多段数据的封装
封装后的多段数据会转换成一个CommonsMultipartFile对象
无法演示,生成的CommonsMultipartFile,保存在Request域对象中
1.2.3 接受(byName接受+请求处理)
控制器方法接受CommonsMultipartFile对象,并进行处理
@RequestMapping("/testUP")
public String testUp(MultipartFile photo, HttpSession session) throws IOException {
String filename = photo.getOriginalFilename(); 获取文件名
String suffixName = filename.substring(filename.lastIndexOf(".")); 获取文件名后缀
String photopath = session.getServletContext().getRealPath("photos"); 获取服务器的目录
String uniquFileName = UUID.randomUUID().toString()+suffixName; uuid+文件后缀作为文件文件名,防止文件重名
File file = new File(photopath);
if(!file.exists()){
file.mkdir();
}
String finalpath = photopath+File.separator+uniquFileName;
System.out.println(finalpath);
photo.transferTo(new File(finalpath));
return "target3";
}
MultipartFile photo 类似byName形式
request里的photo和这里的形参按名字自动赋值