pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 文件上传 -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
<!--servlet-api 导入高版本的 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>

spring.xml

1
<import resource="spring-mvc.xml" />

spring-mvc.xml

  1. DispatcherServlet 从 Spring 容器获取名称为 multipartResolver 的对象,如果存在,则调用 isMultipart (request) 方法检查当前 Web 请求是否为 multipart 类型
  2. 如果是 multipart 类型,DispatcherServlet 将调用 MultipartResolver 的 resolveMultipart (request) 方法,对原始 request 进行装饰,并返回一个 MultipartHttpServletRequest 供后继处理流程使用
1
2
3
4
5
6
7
8
<!-- bean id 名称必须为 multipartResolver 不可修改-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 请求的编码格式,必须和 jSP 的 pageEncoding 属性一致,以便正确读取表单的内容,默认为 ISO-8859-1 -->
<property name="defaultEncoding" value="utf-8"/>
<!-- 上传文件大小上限,单位为字节(10485760=10M) -->
<property name="maxUploadSize" value="10485760"/>
<property name="maxInMemorySize" value="40960"/>
</bean>

前端

1
2
3
4
<form action="/upload" enctype="multipart/form-data" method="post">
<input type="file" name="files"/>
<input type="submit" value="upload">
</form>

后端

方法一「推荐」,通过 MultipartFile 接收

1
2
3
4
5
6
7
8
9
10
11
12
/*
* MultipartFile 常用方法:
* String getOriginalFilename ():获取上传文件的原名
* InputStream getInputStream ():获取文件流
* void transferTo (File dest):将上传文件保存到一个目录文件中
*/
@RequestMapping ("/fileUpload")
public void fileUpload (@RequestParam("files") List<MultipartFile> files, HttpServletRequest request) throws IOException {
for (MultipartFile file : files) {
file.transferTo (new File (Constants.PRO_REAL_PATH +"/"+ file.getOriginalFilename ()));
}
}

方法二

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@RequestMapping ("/fileUpload1")
public void fileUpload1(HttpServletRequest request) throws IOException {
List<MultipartFile> multipartFiles = new ArrayList<>();

MultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求...
if (multipartResolver.isMultipart(request)){
MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
Iterator<String> names = multipartHttpServletRequest.getFileNames();
while (names.hasNext()) {
String name = names.next();
List<MultipartFile> files = multipartHttpServletRequest.getFiles(name);
multipartFiles.addAll(files);
}

for (MultipartFile multipartFile : multipartFiles) {
String fileName = multipartFile.getOriginalFilename();
String fileTotalName = Constants.PRO_REAL_PATH + File.separator + fileName;
File f = new File(fileTotalName);
multipartFile.transferTo(f);
}
}
}

方法三「不要在 spring-mvc.xml 配置 multipartResolver

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@RequestMapping ("/upload")
public void fileUpload (HttpServletRequest request, HttpServletResponse response) throws IOException {
MultipartResolver multipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
//判断 request 是否有文件上传,即多部分请求...
if (multipartResolver.isMultipart(request))
{
//转换成多部分request
MultipartHttpServletRequest multipartRequest = multipartResolver.resolveMultipart(request);

// file 是指 文件上传标签的 name=值
// 根据 name 获取上传的文件...
List<MultipartFile> files = multipartRequest.getFiles("files");
for (MultipartFile file : files) {
//上传后记录的文件...
File imageFile = new File(Constants.PRO_REAL_PATH, file.getOriginalFilename());
//上传...
file.transferTo(imageFile);
}
}
}