Spring MVC—文件上传
MultipartResolver接口
用于处理上传请求,将上传请求包装成可以直接获取文件的数据,方便操作。
两个实现类
tandardServletMultipartResolver
(使用了Servlet3.0标准的上传方式)
CommonsMultipartResolver
(使用了Apache的commons-fileupload来完成具体的上传操作)
实现步骤(多文件上传)
1.导入jar文件
commons-io-2.4.jar
commons-fileupload-1.2.2.jar
2.配置文件
<!-- 处理文件上传 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" /> <!-- 默认编码 (ISO-8859-1) -->
<property name="uploadTempDir" value="/upload/" /> <!-- 上传后的目录名 -->
<property name="maxUploadSize" value="-1" /> <!-- 最大文件大小,-1为无限止(-1) -->
</bean>
3.编写文件上传表单页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<h1>文件上传</h1>
<form action="uploadmore.action" method="post" enctype="multipart/form-data">
<%--选择多个文件--%>
<p>文件:<input type="file" name="file" multiple></p>
<%--选择单个文件--%>
<p>文件:<input type="file" name="file"></p>
<p>提交:<input type="submit" value="提交"></p>
</form>
</body>
</html>
4.编写控制器
进入文件上传表单控制器
@RequestMapping("/touploadmore.action")
public String toUploadMore(){
logger.info("进入多个文件上传控制器");
return "uploadmore";
}
多文件上传控制器
@RequestMapping("/uploadmore.action")
public String uploadMore(@RequestParam("file") CommonsMultipartFile[] files,Model model){
logger.info(files.length);
//建立一个list集合存放信息
List<String> list = new ArrayList<>();
for (CommonsMultipartFile file :files){
if(file.getSize()>0){
try {
String name = this.createName(file.getOriginalFilename());
//创建磁盘路径地址
String path = "F:"+ File.separator+"dir"+File.separator+name;
//创建文件
File file1 = new File(path);
//将接收文件写入目标文件
file.transferTo(file1);
//将文件名放入集合中
list.add(name);
} catch (IOException e) {
e.printStackTrace();
}
}
}
logger.info(list);
//将集合对象,放在作用域中
model.addAttribute("list",list);
return "mainmore";
}
其中为避免多个文件重名创建一个createName方法来修改文件的名称
private String createName(String name){
//获取文件名(除去后缀名)
String prefix=name.substring(0,name.lastIndexOf("."));
//获取文件后缀名
String suffix=name.substring(name.lastIndexOf("."));
String newName=prefix+System.currentTimeMillis()+(int)(Math.random()*10000+1)+suffix;
return newName;
}
在文件名与后缀之间加入上传时的时间与格林威治时间的毫秒差,加上1到10000的随机数的取整
文件上传结束后可以在mainmore.jsp中进行下载,并且在设置的F盘dir文件夹中获取到