今天学习了一个springMVC框架中实现文件上传的操作(该项目为maven),一下为我的课程总结:
目录
1-导入依赖
2-配置MultipartResolver
3-编写表单上传页面
》单文件上传页面
》多文件上传页面
4-编写控制器
》单文件控制器编写
》多文件控制器编写
5-创建成功页面
1-导入依赖
commons-io
commons-io
2.6
commons-fileupload
commons-fileupload
1.3.1
两个jar包分别是:文件上传使用 Apache Commons FileUpload 组件,需要导入 commons-io-2.4.jar 和 commons-fileupload-1.2.2.jar 两个 jar 文件(可在 Apache 官网下载)。
注意:依赖必须加载到web下的lib文件中,否则会报错。
2-配置MultipartResolver
在springMVC-servlet.xml文件中配置:
MultipartResolver接口处理文件上传的数据,操作方便,他的两个实现类是:
- StandardServletMultipartResolver:使用了servlet 3.0 标准的上传方式。
- CommonsMultipartResolver:使用了Apache的Commons-fileupload来完成文件上传的操作。
MultipartResolver接口具有以下常用方法:
| 名称 | 作用 |
|---|---|
| String getOriginalFileName() | 返回客户端提交的原始文件名 |
| void transferTo(File destination) | 将上传的文件保存到目标目录下 |
| boolean isEmpty() | 判断上传的文件是否为空 |
3-编写表单上传页面
》单文件上传页面
单文件上传
<%--如果是form表单的话,在form标签中加入 enctype="multipart/form-data"--%>
单文件上传
<%--如果是form表单的话,在form标签中加入 enctype="multipart/form-data"--%>
注意:负责文件上传表单的编码类型必须是“multipart/form-data”类型。
》多文件上传页面
多文件上传
<%--如果是form表单的话,在form标签中加入 enctype="multipart/form-data"
上传多文件的话,需要加入multiple="multiple"
--%>
<%--如果是form表单的话,在form标签中加入 enctype="multipart/form-data" 上传多文件的话,需要加入multiple="multiple" --%>
多文件上传时:需要加入multiple。
4-编写控制器
》单文件控制器编写
@RequestMapping("/simple2")
public String getSimple_fileUp2(@RequestParam("file") CommonsMultipartFile file, Model model,HttpServletRequest request) {
if(!file.isEmpty()){
//获取文件名称
String filename = file.getOriginalFilename();
System.out.println("源文件名称===="+file.getOriginalFilename());
//获取文件扩展名称
String extension = FilenameUtils.getExtension(filename);//jpg , webp……
System.out.println("获取文件扩展名称===="+extension);
//获取文件大小
long size = file.getSize();
System.out.println("文件大小:"+size);
if(size>500000){
model.addAttribute("msg", "文件不能超过500kB,上传失败");
return "error";
}
//获取img上下文真实路径 使用File.separator(window、Linux自适应路径分隔符,他们的路径分隔符不同)
String realPath = request.getSession().getServletContext().getRealPath("WEB-INF" + File.separator + "static" + File.separator + "img");
File file1=new File(realPath);
while (!file1.exists()) {
//文件不存在时创建文件
file1.mkdir();
}
try {
// 将文件内容传输到指定文件中
file.transferTo(new File(file1,UUID.randomUUID()+filename));
} catch (IOException e) {
e.printStackTrace();
model.addAttribute("msg", "上传失败");
return "error";
}
}else {
model.addAttribute("msg", "上传失败");
return "error";
}
model.addAttribute("msg", "上传成功");
return "success";
}
@RequestMapping("/simple2")
public String getSimple_fileUp2(@RequestParam("file") CommonsMultipartFile file, Model model,HttpServletRequest request) {
if(!file.isEmpty()){
//获取文件名称
String filename = file.getOriginalFilename();
System.out.println("源文件名称===="+file.getOriginalFilename());
//获取文件扩展名称
String extension = FilenameUtils.getExtension(filename);//jpg , webp……
System.out.println("获取文件扩展名称===="+extension);
//获取文件大小
long size = file.getSize();
System.out.println("文件大小:"+size);
if(size>500000){
model.addAttribute("msg", "文件不能超过500kB,上传失败");
return "error";
}
//获取img上下文真实路径 使用File.separator(window、Linux自适应路径分隔符,他们的路径分隔符不同)
String realPath = request.getSession().getServletContext().getRealPath("WEB-INF" + File.separator + "static" + File.separator + "img");
File file1=new File(realPath);
while (!file1.exists()) {
//文件不存在时创建文件
file1.mkdir();
}
try {
// 将文件内容传输到指定文件中
file.transferTo(new File(file1,UUID.randomUUID()+filename));
} catch (IOException e) {
e.printStackTrace();
model.addAttribute("msg", "上传失败");
return "error";
}
}else {
model.addAttribute("msg", "上传失败");
return "error";
}
model.addAttribute("msg", "上传成功");
return "success";
}
在实际开发项目中,需要注意下几点:
一、要获取原文件名及后缀
在实际项目中,对于用户上传文件需要有一定的规范。例如上传个人的证件照,需要的类型的文件为.jpg 、.jpeg 、 .png 、.pneg 。若服务器为Linux系统,上传的文件名存在中文会出现乱码,并存在重名的问题,重名的文件将覆盖上一个同名文件,这是一个严重的问题,所有需要对上传的文件进行重命名。
二、定义上传文件路径
上传的文件路径使用request.getSession().getServletContext().getRealPath()获取指定的文件路径,指定的文件目录有多个时,需要使用File.separator自适应路径分隔符。因为文件上传到web服务器,实际项目的服务器可能是Window系统,也有可能是LInux系统,他们的路径分隔符是不同的。
》多文件控制器编写
//多文件上传
@RequestMapping("/multipart")
public String getMultipart_fileUp(HttpServletRequest request, Model model){
// 创建一个通用的多部分解析器
CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver();
//判断 request 是否有文件上传,即多部分请求
if(commonsMultipartResolver.isMultipart(request)){
MultipartHttpServletRequest httpservletrequest = (MultipartHttpServletRequest)request;
List multipartFiles=httpservletrequest.getFiles("file");
for (int i = 0; i < multipartFiles.size(); i++) {
//获取当前文件对象
MultipartFile multipartFile = multipartFiles.get(i);
String originalFilename = multipartFile.getOriginalFilename();
//文件路径
String filePath=request.getSession().getServletContext().getRealPath("WEB-INF" + File.separator + "static" + File.separator + "img");
File file=new File(filePath);
if(!file.exists()){
//如果文件不存在,则创建
file.mkdir();
}
try {
//文件上传
multipartFile.transferTo(new File(file,UUID.randomUUID()+originalFilename));
} catch (IOException e) {
e.printStackTrace();
model.addAttribute("msg", "上传失败");
return "error";
}
}
}else {
model.addAttribute("msg", "上传失败");
return "error";
}
model.addAttribute("msg", "上传成功");
return "success";
}
注意:文件的重命名还可以使用一下方法
System.currentTimeMillis()+RandomUtils.nextInt(100000000)
//使用RandomUtils获取0~100000000以内的随机数,需要引入Commons-lang-2.6.jar包
5-创建成功页面
恭喜你!!${msg}了
--<-<-<@
注意:文件的重命名还可以使用一下方法
恭喜你!!${msg}了
--<-<-<@



