一、前言
随着互联网的发展,文件上传成为了必备的功能之一,而SpringBoot作为目前最流行的开发框架之一,为文件上传提供了便捷而强大的解决方案。
二、使用multipart/form-data协议进行文件上传
HTTP协议中支持文件上传的ContentType为multipart/form-data,SpringBoot通过MultipartFile接口提供了对该协议的支持。
在Controller中使用MultipartFile实现文件上传:
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
// 处理上传文件
return "success";
}
这里的@RequestParam("file")指定了上传文件对应的参数名,SpringBoot会自动将上传的文件封装成MultipartFile类型的参数传递给Controller方法。
上传文件的前端代码:
三、限制上传文件大小
默认情况下,SpringBoot没有对上传文件大小进行限制,但是可以通过配置上传文件大小来限制用户上传文件的大小。
在application.properties或是application.yml文件中添加以下配置:
# 限制上传文件大小为10MB
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
其中,max-file-size表示单个文件上传大小,max-request-size表示总上传大小。若超过限制,则会报FileSizeLimitExceededException异常。
四、保存上传文件
接收到上传文件后,一般需要将文件保存到服务器的磁盘或是云存储中,SpringBoot通过MultipartFile提供的transferTo方法可以从MultipartFile中获取文件内容并保存到指定的位置。
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
// 获取上传文件名
String fileName = file.getOriginalFilename();
// 拼接保存文件的路径
String filePath = request.getSession().getServletContext().getRealPath("upload/");
// 如果路径不存在则创建该路径
File dest = new File(filePath + fileName);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try {
// 保存文件
file.transferTo(dest);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
该示例中,首先获取上传文件的原始名称,接着通过HttpServletRequest获取到保存文件的路径,之后判断路径是否存在,若不存在则创建该路径,最后调用transferTo方法将文件保存到指定位置。
五、处理多文件上传
在某些情况下,需要一次性上传多个文件,此时可以使用SpringBoot提供的MultipartHttpServletRequest实现多文件上传。
@PostMapping("/multiUpload")
public String multiUpload(HttpServletRequest request) {
List
files = ((MultipartHttpServletRequest) request).getFiles("file");
for (MultipartFile file : files) {
// 处理上传文件
}
return "success";
}
该示例中,首先获取上传的所有文件通过MultipartHttpServletRequest的getFiles方法获取到MultipartFile集合,之后遍历集合处理每一个上传文件。
六、完成代码
上传文件Controller的完整代码:
@Controller
public class UploadController {
@GetMapping("/upload")
public String upload() {
return "upload";
}
@GetMapping("/multiUpload")
public String multiUpload() {
return "multiUpload";
}
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
// 获取上传文件名
String fileName = file.getOriginalFilename();
// 拼接保存文件的路径
String filePath = request.getSession().getServletContext().getRealPath("upload/");
// 如果路径不存在则创建该路径
File dest = new File(filePath + fileName);
if (!dest.getParentFile().exists()) {
dest.getParentFile().mkdirs();
}
try {
// 保存文件
file.transferTo(dest);
} catch (IOException e) {
e.printStackTrace();
}
return "success";
}
@PostMapping("/multiUpload")
public String multiUpload(HttpServletRequest request) {
List
files = ((MultipartHttpServletRequest) request).getFiles("file");
for (MultipartFile file : files) {
// 处理上传文件
}
return "success";
}
}
上传文件的HTML代码:
文件上传