开发环境
基于:IntelliJ IDEA
、Maven构建工具
、JDK1.8
、SpringBoot 2.3.4
、Spring4.3.28
编写。
官人如需使用 IDEA 请阅读教程:IntelliJ IDEA
官人如需使用 Maven 请阅读教程:Maven 构建工具的下载与安装
更多干货
请参考:《穿越 Java 之 语法基础篇》 系列文章
请参考:《穿越 Java 之 Web基础篇 》系列文章
请参考:《穿越 Java 之 开发必备框架篇 》 系列文章
请阅读:《穿越 Java 之 SpringBoot框架篇》系列文章
请阅读:《穿越 Java 之 SpringCloud微服务架构篇》 系列文章
页面
- form表单需要注意:
method = “post"
encrytype=“multipart/form-data”
form表单的action 属性指定位置 进行上传操作。
Spring里的配置
1.显示页面。 页面在WEB-INF下客户打不开 需要 controller
- 默认情况下,Spring MVC 的
MultipartResolver
组件,并没有配置在Spring容器中(DispatcherServlet就不会使用) 下图为源码过程
- 要想处理文件上传的请求,需要自己向容器中注册 该组件
要求
- bean的名称必须是
multipartResolver
,类型必须是MultipartResolver
的实现类。
下图两个实现类 StandardServletMultipartResolver是标准的Servlet 3.0以后的实现 ,
CommonsMultipartResolver是 Commons fileupload 组件的实现
总结
-
如果DispatcherServlet的某种组件只有一个时, 它的名字是不行瞎叫的(名字就是接口的首字母小写)。
-
如果某种组件的个数有多个,名字起不起,以及叫什么都无所谓,只要类型匹配即可。
-
如果使用 CmmonsMultipartResolver 需要导入依赖:
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
- 后续处理器方法上的形参类型可以写(MultipartFile)。
@PostMapping("/upload")
public String upload(@RequestParam("photo") MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();//原始文件名
String extension = originalFilename.substring(originalFilename.lastIndexOf(".")); //后缀名
String filename= UUID.randomUUID().toString().replace("-", "") + extension;
//假设上传到C盘
String realPath = webApplicationContext.getServletContext().getRealPath("/upload");
file.transferTo(new File(realPath,filename));
return "redirect:http://www.baidu.com";
}
野路子
@PostMapping("/upload2")
public String upload2(HttpServletRequest request){
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getServletContext());
MultipartHttpServletRequest multipartHttpServletRequest = commonsMultipartResolver.resolveMultipart(request);
MultipartFile photo = multipartHttpServletRequest.getFile("photo");
//后续都一样。
System.out.println(photo!=null);
return "redirect:http://www.baidu.com";
}