上傳文件代碼
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 文件對象數(shù)組
* @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("寫入文件:{} 異常搔驼,發(fā)生時間:{} ", diskPath, DateUtil.date().toString(), e);
}
});
}
異步線程池
@Component
@EnableAsync
public class FileThreadPool {
@Bean("fileExecutor")
public Executor fileExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(25);//核心線程數(shù)25:線程池創(chuàng)建時候初始化的線程數(shù)
executor.setMaxPoolSize(50);//最大線程數(shù)50:線程池最大的線程數(shù),只有在緩沖隊列滿了之后才會申請超過核心線程數(shù)的線程
executor.setQueueCapacity(500);//緩沖隊列200:用來緩沖執(zhí)行任務(wù)的隊列
executor.setKeepAliveSeconds(60);//允許線程的空閑時間60秒:當超過了核心線程出之外的線程在空閑時間到達之后會被銷毀
executor.setThreadNamePrefix("fileExecutor-");// 線程池名的前綴:設(shè)置好了之后可以方便我們定位處理任務(wù)所在的線程池
//* 線程池對拒絕任務(wù)的處理策略:這里采用了CallerRunsPolicy策略舅柜,當線程池沒有處理能力的時候瞒窒,該策略會直接在 execute
// 方法的調(diào)用線程中運行被拒絕的任務(wù)绢馍;如果執(zhí)行程序已關(guān)閉向瓷,則會丟棄該任務(wù)*//*
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setAwaitTerminationSeconds(60);
executor.initialize();
return executor;
}
}
注意:代碼里帶有Util的工具類,均來自 Hutools工具包舰涌,一個好的工具,能大大提高你的開發(fā)效率你稚,墻裂建議使用瓷耙。
添加如下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
中添加如下參數(shù)來指定大小宇弛,不同的版本的springboot參數(shù)是不一樣的鸡典。
需要注意的是單位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
本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布舅踪!