文件上传
springboot默认封装了一个文件上传,MultipartAutoConfiguration自动装配了一个处理文件上传的处理器StandardServletMultipartResolver,在处理请求参数的时候,如果使用了@RequestPart,参数类型为MultipartFile,请求的Content-type为multipart/开头就会被处理。
@Bean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)
@ConditionalOnMissingBean(MultipartResolver.class)
public StandardServletMultipartResolver multipartResolver() {
StandardServletMultipartResolver multipartResolver = new StandardServletMultipartResolver();
multipartResolver.setResolveLazily(this.multipartProperties.isResolveLazily());
return multipartResolver;
}
StandardServletMultipartResolver处理器默认读取配置文件中的以spring.servlet.multipart开头的属性进行初始化,需要修改默认配置的话,在文件里配置就好。
@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {
/**
* Whether to enable support of multipart uploads.
*/
private boolean enabled = true;
//文件存储中间位置
private String location;
//文件最大值
private DataSize maxFileSize = DataSize.ofMegabytes(1);
请求最大
private DataSize maxRequestSize = DataSize.ofMegabytes(10);
/**
* 文件写入磁盘的阈值
*/
private DataSize fileSizeThreshold = DataSize.ofBytes(0);
}
spring:
servlet:
multipart:
max-file-size: 5MB
测试
@SneakyThrows
@PostMapping("uploadFile")
public String uploadFile(@RequestParam("email") String email,
@RequestParam("nickName") String nickName,
@RequestPart("file") MultipartFile file,
@RequestPart("manyFiles") MultipartFile[] manyFiles) {
log.info("email->{},nickName->{}", email, nickName);
String fileName = file.getOriginalFilename();
file.transferTo(new File(ClassUtils.getDefaultClassLoader().getResource("").getPath()
+ File.separator + UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."))));
Arrays.asList(manyFiles).stream().forEach((e) -> {
try {
e.transferTo(new File(ClassUtils.getDefaultClassLoader().getResource("").getPath()
+ File.separator + UUID.randomUUID() + fileName.substring(fileName.lastIndexOf("."))));
} catch (IOException ioException) {
ioException.printStackTrace();
}
});
return "success";
}