上传文件代码
controller
public class PicController {
//注入异步线程池
@Autowired
private FileThreadPool fileThreadPool;
@Autowired
private FileService fileService;
/**
* 图片上传接口
*
* @param uploadFiles
* @param filePath
*/
@RequestMapping("/")
public void uploadPic(@RequestParam(required = false) MultipartFile[] uploadFiles, String filePath) {
if (ObjectUtil.isEmpty(uploadFiles) || uploadFiles.length < 1 || StrUtil.isBlank(filePath)) {
return;
} else {
fileThreadPool.fileExecutor().execute(() -> fileService.write(uploadFiles, filePath));
}
}
}
service
/**
* 写入文件到磁盘
*
* @param files 文件对象数组
* @param path 磁盘路径
*/
public void write(MultipartFile[] files, String path) {
path = StrUtil.removeSuffix(path, "/");
path = StrUtil.removeSuffix(path, "\\");
if (!FileUtil.exist(path)) {
FileUtil.mkdir(path);
}
String finalPath = path;
Arrays.asList(files).parallelStream().forEach(file -> {
//拼接磁盘路径
String diskPath = finalPath + "/" + file.getOriginalFilename();
try {
//删除原文件
FileUtil.del(diskPath);
FileUtil.writeBytes(file.getBytes(), diskPath);
} catch (IOException e) {
log.error("写入文件:{} 异常,发生时间:{} ", diskPath, DateUtil.date().toString(), e);
}
});
}
异步线程池
@Component
@EnableAsync
public class FileThreadPool {
@Bean("fileExecutor")
public Executor fileExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(25);//核心线程数25:线程池创建时候初始化的线程数
executor.setMaxPoolSize(50);//最大线程数50:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
executor.setQueueCapacity(500);//缓冲队列200:用来缓冲执行任务的队列
executor.setKeepAliveSeconds(60);//允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
executor.setThreadNamePrefix("fileExecutor-");// 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
//* 线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在 execute
// 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务*//*
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
}
注意:代码里带有Util的工具类,均来自 Hutools工具包,一个好的工具,能大大提高你的开发效率,墙裂建议使用。
添加如下maven坐标,解锁更多惊喜。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.0.7</version>
</dependency>
配置
因为springboot对上传文件大小是有默认值的,超过这个值会直接报错,如下就是错误信息:
the request was rejected because its size (15633200) exceeds the configured
可以在 application.yml
或 application.properties
中添加如下参数来指定大小,不同的版本的springboot参数是不一样的。
需要注意的是单位MB两个字母都需要大写,小写可能会有问题,还有 max-file-size
表示的是单个文件最大是多少,max-request-size
表示的是一次请求文件总大小是多少。
v1.3
multipart.maxFileSize=xxxMB
multipart.maxRequestSize=xxxMB
v1.4-1.5
spring.http.multipart.maxFileSize=xxxMB
spring.http.multipart.maxRequestSize=xxxMB
v2.0
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=50MB
使用postman进行测试
postman测试图片上传.png本文由博客一文多发平台 OpenWrite 发布!
网友评论