前言
SpringBoot使用MultiPartFile接收來自表單的file文件,然後進行服務器的上傳是一個項目最基本的需求,我以前的項目都是基於SpringMVC框架搭建的,所以在使用SpringBoot的時候進行MultiPartFile上傳遇到了坑
遇到的問題
(事實上我在本地windows10環境下,兩次都沒報錯,可以正常上傳,是在服務器上運行時發現第二次調用報錯了,我查了一下,具體原因沒找到,可能和linux的臨時文件回收策略有關),以下是報錯信息:
注意:這裏的報錯是提示一個後綴名爲.fuds的臨時文件找不到,而不是.png之類的(和你上傳的文件相同格式)找不到,如果是後者,那麼你遇到的是另一個問題,是location設置問題,具體解決方法可以百度,這裏我們就不講了。
問題分析
我們看一下transferTo()的實現方式可以瞭解到,其實就是對文件流進行了讀取,我們應該知道,流只可以被讀取一次,所以第二次讀取的時候肯定就報錯了,所以我考慮不直接讀取流,而是將流複製一份,這時候我想到將第一次調用改爲使用FileUtils.copyInputStreamToFile()方法。
問題解決
具體使用方式如下:
出現bug的代碼
try {
//保存文件, file是MultipartFile, dest是目標文件
file.transferTo(dest);
} catch (Exception e) {
log.error("文件上傳失敗", e);
throw new AppException("500", "文件上傳失敗, 請重試");
}
修復bug的代碼
try {
//保存文件, file是MultipartFile, dest是目標文件
FileUtils.copyInputStreamToFile(file.getInputStream(), dest);
} catch (Exception e) {
log.error("文件上傳失敗", e);
throw new AppException("500", "文件上傳失敗, 請重試");
}