springboot文件上传
springboot文件上传
来源:https://blog.lqdev.cn/2018/08/07/springboot/chapter-seventeen/
我们知道,前端上传文件时,最常见的就是利用
Form
表单的方式进行文件的上传功能了,上传时设置enctype
为multipart/form-data
,或者直接利用jquery
的一些上传插件实现。而后端,在jsp+Servlet
时代,最常见的就是利用smartupload
上传组件。而在SpringMvc
时代,其提供了MultipartFile
封装类,它包含了文件的二进制流和文件相关属性(文件名、大小等)。所以在SpringBoot
中也是使用此封装类进行文件上传的。
MultipartFile
是个接口类,它的实现类有CommonsMultipartFile
和StandardMultipartFile
。
-
StandardMultipartFile:是基于
j2ee
自带的文件上传进行解析,即使用Servlet3.0
提供的javax.servlet.http.Part
上传方式。 -
CommonsMultipartFile:是基于
apache fileupload
的解析。
所以正常我们使用时,也是无需关系底层是以哪种方式进行文件上传处理的,SpringMvc会给我们做相应的转换的。
基于J2EE自带方式
这种方式下,其实无需任何配置。只需按正常的web开发项目集成即可。
# 最大支持文件大小 即单个文件大小
spring.http.multipart.max-file-size=1Mb
# 最大支持请求大小 即一次性上传的总文件大小
spring.http.multipart.max-request-size=10Mb
@RestController
@Slf4j
public class FileUploadController {
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IllegalStateException, IOException {
// 判断是否为空文件
if (file.isEmpty()) {
return "上传文件不能为空";
}
// 文件类型
String contentType = file.getContentType();
// springmvc处理后的文件名
String fileName = file.getName();
log.info("服务器文件名:" + fileName);
// 原文件名即上传的文件名
String origFileName = file.getOriginalFilename();
// 文件大小
Long fileSize = file.getSize();
// 保存文件
// 可以使用二进制流直接保存
// 这里直接使用transferTo
file.transferTo(new File("d://okong-" + origFileName));
return String.format(file.getClass().getName() + "方式文件上传成功!\n文件名:%s,文件类型:%s,文件大小:%s", origFileName, contentType,fileSize);
}
}
基于FileUpload包方式
原来在
Springmvc
时,我们通常都是使用CommonsMultipartResolver
进行文件上传处理类配置的,比如最大上传文件大小的。而基于在SpringBoot
下,略微有些不同。
- 加入
fileUpload
依赖
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.3</version>
</dependency>
- 编写一个配置类
FileUploadConfig.java
@Configuration
public class FileUploadConfig {
@Bean
public MultipartResolver custom() {
return new CommonsMultipartResolver();
}
}
由于spring.http.multipart.enabled
默认是true
,所以加载类MultipartAutoConfiguration
会自动加载,这样fileUpload就会异常了。
- 方法1:在启动类下将此配置类不进行自动加载 :
@EnableAutoConfiguration(exclude = {MultipartAutoConfiguration.class})
- 方法2:直接设置spring.http.multipart.enabled为false。
spring.http.multipart.enabled=false
- 测试
使用方法和上一个一样
@RestController
@Slf4j
public class FileUploadController {
@PostMapping("/upload")
public String upload(@RequestParam MultipartFile file) throws IllegalStateException, IOException {
// 判断是否为空文件
if (file.isEmpty()) {
return "上传文件不能为空";
}
// 文件类型
String contentType = file.getContentType();
// springmvc处理后的文件名
String fileName = file.getName();
log.info("服务器文件名:" + fileName);
// 原文件名即上传的文件名
String origFileName = file.getOriginalFilename();
// 文件大小
Long fileSize = file.getSize();
// 保存文件
// 可以使用二进制流直接保存
// 这里直接使用transferTo
file.transferTo(new File("d://okong-" + origFileName));
return String.format(file.getClass().getName() + "方式文件上传成功!\n文件名:%s,文件类型:%s,文件大小:%s", origFileName, contentType,fileSize);
}
}