前期回顾:
创建Spring Boot项目
Spring Boot项目基础配置
本文介绍Spring Boot上传文件的两种形式,一种是解析方式是StandardServletMultipartResolver,它是基于Servlet3.0的,所以不需要依赖其他jar包,另一个组件是CommonsMultipartResolver,使用它需要额外引用其它jar包,如想了解,请继续往下看:
- 公共引用方法:
private final static String PATH = "/data/files/";
private File buildDirectory() {
File directory = new File(PATH);
if (!directory.exists() || !directory.isDirectory()) {
directory.mkdirs();
}
return directory;
}
private void upload(MultipartFile multipartFile, File directory) {
File file = new File(PATH + multipartFile.getOriginalFilename());
String filename = multipartFile.getOriginalFilename();
//实际项目中可能会上传重名文件,但内容可能不一致,所以我们需要重置文件名称,否则原文件将丢失
if (file.exists()) {
filename = System.currentTimeMillis() + filename;
}
try {
multipartFile.transferTo(new File(directory, filename));
} catch (IOException e) {
log.error("上次文件失败", e);
throw new RuntimeException("上次文件失败");
}
}
- StandardServletMultipartResolver:
配置文件:
spring:
servlet:
multipart:
enabled: true
location: /data/
max-file-size: 1MB
max-request-size: 5MB
resolve-lazily: false
file-size-threshold: 0
enabled:开启上传文件配置;
location:文件上传临时保存位置,没有写入最终保存位置时存放的位置;
max-file-size:上传单个文件最大大小;
max-request-size:上传一组文件最大大小;
resolve-lazily:是否延迟解析,相当于懒加载;
file-size-threshold:文件大小阈值,当大于这个阈值时将写入到磁盘,否则存在内存中,默认为0
上传文件Java实现:
@PostMapping("/standardServletMultipartResolver")
public String standardServletMultipartResolver(@RequestParam(name = "file") MultipartFile[] multipartFiles) {
Assert.isTrue(multipartFiles != null && multipartFiles.length > 0, "请选择文件");
//获取保存文件磁盘的文件夹,如果不存在则创建
File directory = buildDirectory();
for (int i = 0; i < multipartFiles.length; i++) {
upload(multipartFiles[i], directory);
}
return "上传成功!";
}
测试:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/demo/file/standardServletMultipartResolver" method="post" enctype="multipart/form-data" target="frameName">
<!-- multiple属性表示可上次多个文件 -->
<input type="file" name="files" value="选择文件" multiple>
<input type="submit" value="上传">
</form>
<!-- 提交成功后停留在原页面 -->
<iframe src="" frameborder="0" name="frameName"></iframe>
</body>
</html>
- CommonsMultipartResolver:
配置文件:
spring:
servlet:
multipart:
enabled: false
location: /data/
max-file-size: 1MB
max-request-size: 5MB
resolve-lazily: false
file-size-threshold: 0
依赖:
<commons.fileupload>1.3.3</commons.fileupload>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>${commons.fileupload}</version>
</dependency>
Java实现:
@PostMapping("/commonsMultipartResolver")
public String commonsMultipartResolver(HttpServletRequest request) {
List<MultipartFile> multipartFiles = getFormMultipartFile(request);
Assert.isTrue(multipartFiles != null && multipartFiles.size() > 0, "请选择需要上传的文件");
File directory = buildDirectory();
multipartFiles.stream().forEach(multipartFile -> {
upload(multipartFile, directory);
});
return "上传成功";
}
private List<MultipartFile> getFormMultipartFile(HttpServletRequest request) {
//将当前上下文初始化给CommonsMutipartResolver多部分解析器)
MultipartResolver resolver = new CommonsMultipartResolver(request.getSession().getServletContext());
MultipartHttpServletRequest multipartRequest = resolver.resolveMultipart(request);
//检查form中是否有enctype="multipart/form-data"
if (resolver.isMultipart(request)) {
//键名是form表单中上传文件控件的name值
return multipartRequest.getFiles("files");
}
return null;
}
测试代码就不再重复了,和上面的html代码一致,将提交路径更改一下就行了。
- 总结:需要注意的点是使用CommonsMultipartResolver解析器的时候,我们需要关闭Spring Boot上传文件配置,当然也可以通过其他途径去关闭Spring Boot的StandardServletMultipartResolver组件,比如在项目的启动器中去排除等。个人建议使用StandardServletMultipartResolver,简单、方便,无需添加其它依赖,你们觉得呢?
如有不到之处,欢迎各位留言指正,不慎感激。
更多文章:
点击跳转CSDN博客
点击跳转简书博客
公众号:代码小搬运