Spring Boot File Upload 文件上传和Sping MVC文件上传类似:Spring MVC File Upload 文件的上传

本示例以Spring Boot 2.0.3.RELEASE 为例来演示文件的上传,系统环境使用Windows,注意路径

1. 生成项目

打开 https://start.spring.io/ 选择版本,所需要的依赖和相关信息,然后点击生成项目。

导入到Eclipse中:

2. 编写上传代码

处理文件上传的控制器,包含单一文件上传和多个文件上传:

FileUploadController.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package com.devnp.springbootfileuploaddemo;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@Controller
public class FileUploadController {

@GetMapping("/")
public String listUploadedFiles(Model model) throws IOException {

return "uploadForm" ;
}


@PostMapping("/upload")
public String upload(@RequestParam("avatar") MultipartFile file,
RedirectAttributes redirectAttributes, Model model) throws IOException {

List<String> msg = new ArrayList<>();

FileCopyUtils.copy(file.getBytes(), new File("D:/" + file.getOriginalFilename()));

msg.add("You successfully uploaded " + file.getOriginalFilename() + "!");

model.addAttribute("messages", msg);

return "uploadMessage" ;
}

@PostMapping("/uploads")
public String upload(@RequestParam("files") MultipartFile[] files, Model model) throws IOException {

List<String> msg = new ArrayList<>();

for(int i = 0; i< files.length; i++ ) {

if(!StringUtils.isEmpty(files[i].getOriginalFilename())) {
FileCopyUtils.copy(files[i].getBytes(), new File("D:/" + files[i].getOriginalFilename()));

msg.add("You successfully uploaded " + files[i].getOriginalFilename() + "!");
}
}

model.addAttribute("messages", msg);

return "uploadMessage" ;
}
}

上传页面:
uploadForm.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>File Upload</title>
</head>
<body>
<div>Single File Upload</div>
<form method="POST" enctype="multipart/form-data" action="/upload">
<table>
<tr>
<td>File to upload:</td>
<td><input type="file" name="avatar" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Upload" /></td>
</tr>
</table>
</form>

<div>Multiple Files Upload</div>
<form method="POST" enctype="multipart/form-data" action="/uploads">
<table>
<tr>
<td>File to upload:</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>File to upload:</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td>File to upload:</td>
<td><input type="file" name="files" /></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Upload" /></td>
</tr>
</table>
</form>
</body>
</html>

当文件上传成功时会展示上传的文件名称, 所以展示页面:
uploadMessage.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8" />
<title>File Upload Message</title>
</head>
<body>
<div>
<ul>
<li th:each="msg : ${messages}" th:text="${msg}"></li>
</ul>
</div>
</body>
</html>

3. 测试

启动项目,然后在浏览器输入:http://localhost:8080

4. 配置

在Spring Boot中,可以使用配置对文件上传进行设置:

1
2
3
4
5
6
7
# MULTIPART (MultipartProperties)
spring.servlet.multipart.enabled=true # 是否允许多个文件上传
spring.servlet.multipart.file-size-threshold=0 # 文件写入磁盘后的阈值。 值可以使用后缀“MB”或“KB”分别表示兆字节或千字节。
spring.servlet.multipart.location= # 上传文件的中间位置。
spring.servlet.multipart.max-file-size=1MB # 上传单个文件 最大值 可以以 "MB" 或者 "KB"作为单位
spring.servlet.multipart.max-request-size=10MB # 上传文件的总数和的最大值 可以以 "MB" 或者 "KB"作为单位
spring.servlet.multipart.resolve-lazily=false # 是否在文件或参数访问时懒惰地解决多部分请求。

配置这些设置之后,如果出现不符合的情况,spring则会抛出异常,可以应该捕获这些异常来完成对应的相应。

5. 代码

spring-boot-file-upload-demo.zip