SpringMVC中的文件上传
1.项目准备
- 设置一个方法用户请求时进行文件上传的页面显示:
@RequestMapping("show")
public String show(){
return "show";
}
- 设置上传页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/u/up" method="post" enctype="multipart/form-data">
<input type="text" name="text">
<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>
- 设置一个方法用于上传的地址,并在上传请求到达后进行页面重定向
@PostMapping("/up")
public String up(){
return "redirect:https://www.baidu.com/";
}
2.使用MVC框架
MVC中用于文件上传的组件是 MultipartResolver
- 默认情况下,Spring MVC 的
MultipartResolver
组件,并没有配置在Spring容器中(DispatcherServlet就不会使用) - 如果想要
MultipartResolver
工作,需要自己在容器中进行注册- 要求: bean的名称必须是 “multipartResolver” ,类型必须是
MultipartResolver
的实现类。
- 要求: bean的名称必须是 “multipartResolver” ,类型必须是
如果DispatcherServlet的某种组件只有一个时, 它的名字是不行瞎叫的(名字就是接口的首字母小写)。
如果某种组件的个数有多个,名字起不起,以及叫什么都无所谓,只要类型匹配即可。
两个实现类:StandardServletMultipartResolver
和CommonsMultipartResolver
配置:
<bean name="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!--防止中文乱码-->
<property name="defaultEncoding" value="UTF-8"></property>
</bean>
开发类
@Controller
@RequestMapping("/u")
public class UpLoadController {
@Autowired
private WebApplicationContext context;
@RequestMapping("show")
public String show(){
return "show";
}
// 实际操作
@PostMapping("/up")
public String up(@RequestParam("file")MultipartFile file) throws IOException {
// 获取原始文件名
String originalFilename = file.getOriginalFilename();
// 拿到文件后缀
String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
// 利用UUID将文件名替换
String fileName = UUID.randomUUID().toString().replace("-","") + extension;
// 设置上传的路径
String filePath = context.getServletContext().getRealPath("/upload/");
File file1 = new File(filePath + fileName);
//如果路径不存在直接创建
if(!file1.exists()) file1.mkdirs();
file.transferTo(file1);
return "redirect:https://www.baidu.com/";
}
}