1:springMVC文件上传介绍
在springMVC的9大组件中,其中的一个就是MultipartResolver
,即文件上传解析组件,该组件当是文件上传请求时会将HttpServletRequest类,解析生成为MultipartHttpServletRequest类,该类在继承了HttpServletRequest的同时,还实现了接口MultipartRequest
,源码如下:
public interface MultipartRequest {
Iterator<String> getFileNames();
@Nullable
MultipartFile getFile(String name);
List<MultipartFile> getFiles(String name);
Map<String, MultipartFile> getFileMap();
MultiValueMap<String, MultipartFile> getMultiFileMap();
@Nullable
String getMultipartContentType(String paramOrFileName);
}
可以看到接口中定义了很多文件相关的方法,因此MultipartHttpServletRequest就拥有了操作文件的能力
。对于MultipartResolver接口有两个是实现类,一个是CommonMultipartResolver
,另外一个是StandardServletMultipartResolver
,由于前者需要依赖于apache的第三方包,而后者只需要servlet的API就可以了,所以在实际使用中StandardMultipartResolver使用的比较多。因此,想要完成文件上传操作,只要是能够创建出StandardMultipartResolver就可以了,而在springboot中,在没有指定上传文件解析器时,创建的也正是StandardMultipartResolver,自动创建的源码如下:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({
Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })
@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)
@ConditionalOnWebApplication(type = Type.SERVLET)
@EnableConfigurationProperties(MultipartProperties.class)
public class MultipartAutoConfiguration {
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
}
2:配置上传文件参数
### 配置springboot自动生成StandardMultipartResolver对象设置开始 ###
# 指定文件上传文件夹
spring.servlet.multipart.location=/Users/xb/Desktop/D/dongsir-dev/test-jsp-in-springboot
# 限制单个文件的大小 5M
spring.servlet.multipart.max-file-size=5242880
# 限制所有文件的最大大小
spring.servlet.multipart.max-request-size=20MB
### 配置springboot自动生成StandardMultipartResolver对象设置结束 ###
3:jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>文件上传</title>
</head>
<body>
<form method="post" action="./request" enctype="multipart/form-data">
<input type="file" name="file" value="请选择要上传文件">
<input type="submit" value="提交">
</form>
</body>
</html>
4:跳转jsp接口
@RequestMapping("/upload/page")
public String uploadPage() {
return "upload";
}
5:接口上传请求
这里直接使用HttpServletRequest作为参数,另外还可以使用javax.servlet.http.Part
直接通过write
方法就可以了,这是servlet API中提供的接口,还可以使用org.springframework.web.multipart.MultipartFile
,这是spring提供的,这种方式直接使用其transfterTo
方法就可以了。源码如下:
@RequestMapping("/upload/request")
public Map<String, Object> uploadRequest(HttpServletRequest request) {
Map<String, Object> res = new HashMap<>();
MultipartHttpServletRequest multipartHttpServletReq = null;
if (request instanceof MultipartHttpServletRequest) {
multipartHttpServletReq = (MultipartHttpServletRequest) request;
MultipartFile multipartFile = multipartHttpServletReq.getFile("file");
String originalFilename = multipartFile.getOriginalFilename();
res.put("上传文件名", originalFilename);
res.put("上传结果", "成功");
try {
File file = new File(originalFilename);
multipartFile.transferTo(file);
} catch (Exception e) {
}
return res;
} else {
res.put("result", "不是文件上传请求");
return res;
}
}
6:上传测试
访问http://localhost:8089/testBean/upload/page
选择文件上传即可。