SpringMVC上传文件
分析
- 编写jsp下的form表单
表单要有以下属性值- 提交方式必须为post,因为如果是get的话,大小有限制
- enctype属性必须设置为:multipart/form-data,因为这样是分段解析,为什么分段,可以看上传图片的请求体
- 如何解析,需要使用jar包,有apache提供的两个jar包
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
- 如何编写Controller类下的方法
- 先设置上传的路径,且判断是否有当前路径
- 准备解析reques工具
- 开始解析,使用parseRequest方法,返回一个List集合
- 开始遍历
- 筛选是否为普通类型文件,或者是否是上传文件类型,使用isFormField()方法
- 获取文件名称,且因名字需要唯一化,使用UUID工具,生成唯一id
- 写入文件传出参数文件上传路径与文件名字
- 最后,删除临时文件,为什么要删除临时文件,因为上传大于10kb时会产生临时文件,小于10kb直接进缓存区
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testFileUpload")
public String testFileUpload(HttpServletRequest request) throws Exception {
System.out.println("testFileUpload...");
//1.设置上传路径
String path = request.getSession().getServletContext().getRealPath("/upload/");
//判断路径是否存在
File file = new File(path);
if(!file.exists()){
//创建文件夹
file.mkdirs();
}
//2.解析request对象,获取文件上传项
ServletFileUpload upload = new ServletFileUpload(new DiskFileItemFactory());
//3.解析
List<FileItem> items = upload.parseRequest(request);
//遍历
for (FileItem item : items) {
//判断item是否是上传文件类型
if(item.isFormField()){
//说明是普通form表单类型
}else{
//说明是上传文件项
//4.获取文件的名称
String name = item.getName();
//生成唯一id
String uuid = UUID.randomUUID().toString().replace("-","");
name = uuid+"_"+name;
//5.完成文件上传
item.write(new File(path,name));
//6.删除临时文件
item.delete();
}
}
return "success";
}
jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>response</title>
</head>
<body>
<h3>文件上传</h3>
<form action="user/testFileUpload" method="post" enctype="multipart/form-data">
上传文件: <input type="file" name="upload"> <br>
<input type="submit" value="上传">
</form>
</body>
</html>
如有不足,还望指点