上傳文件代碼
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