Spring Boot 相对于 MVC,简化了文件上传的步骤。它自带提供了 MultipartResolver 来管理文件上传,以下就来看一个最简单的例子:
upload.html
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="targetFile" value="Select your file: ">
<input type="submit" value="Upload">
</form>
FileUploadController.java
@RestController
public class FileUploadController {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy/MM/dd/");
@PostMapping("/upload")
public String upload(MultipartFile targetFile, HttpServletRequest request) {
// 1. 构建保存上传文件的文件夹位置,并采用日期格式分别管理 (.../uploadFile/yyyy/mm/dd/...)
String rootFolderPath = request.getSession().getServletContext().getRealPath("/uploadFile/");
String formattedDate = simpleDateFormat.format(new Date());
File folder = new File(rootFolderPath + formattedDate);
// 2. 文件夹不存在时,创建它
if (!folder.isDirectory())
folder.mkdirs();
System.out.println(targetFile);
// 3. 采用 UUID 重命名文件,以避免重名覆盖
String originalFilename = targetFile.getOriginalFilename();
String newFilename = UUID.randomUUID().toString()
+ originalFilename.substring(originalFilename.lastIndexOf("."));
// 4. 进行文件上传,并回传文件访问地址
try {
targetFile.transferTo(new File(folder, newFilename));
String urlPath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort()
+ "/uploadFile/" + formattedDate + newFilename;
return urlPath;
} catch (IOException e) {
e.printStackTrace();
}
return "Upload failed!";
}
}
然而实际上,真正负责上传的代码只有一行:
targetFile.transferTo(new File(folder, newFilename));
多文件上传
多文件上传与单文件上传基本上是一样的,不一样的地方有两点。其一,在 html 中的 <input>
上传标签中需要做添加一个 multiple
属性:
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="targetFiles" value="Select your file: " multiple>
<input type="submit" value="Upload2">
</form>
第二点,Controller 需要写一个循环,来遍历这些文件,其它都与第一种方法一样:
@PostMapping("/upload")
public String upload(MultipartFile[] targetFiles, HttpServletRequest request) {
for (MultipartFile targetFile : targetFiles)
...
...
}
以下是一些有关于上传的常用配置:
spring:
servlet:
multipart:
enabled: true
file-size-threshold: 0
location: /tmp/java_tmp
max-file-size: 50MB
max-request-size: 50MB
resolve-lazily: false