Spring boot 上傳文件java.io.IOException: java.io.FileNotFoundException 異常


https://kerry.blog.csdn.net/article/details/80366438

 

spring boot實現文件上傳,剛開始同步實現,沒有問題,后來耗時太長,改成異步實現,但是異步實現,在上傳過程中發現報錯,

類似下面的堆棧:

java.io.IOException:java.io.FileNotFoundException: /var/private/tomcat.273391201583741210.8080/work/Tomcat/localhost/ROOT/tmp/source/IMG_20160129_132623.tmp(No such file or directory)

表面看了,是一個臨時文件找不到,我以為目錄沒有,嘗試創建臨時文件需要的目錄,發現也不行。

后來百度有人說是內存文件最大size 的設置不對,默認設置比較大,如果小於這個值,不會創建臨時文件,所以,修改這個參數

setInMemorySize為1,但是還是不行。

其實現在看來,不是這個問題,唯一的變動就是同步改成異步操作。后來google發現終於找到原因了,分享給大家。

原因: 跟臨時文件找不到沒有關系,原因在於異步操作上傳是,請求流已經關閉了,所以異步上傳過程中會失敗。

方案:在主線程保存全部文件流,在異步線程中進行處理。完美解決!!!

參考代碼如下:

保存全部文件流數據在byte數組:

List<Object> list = new ArrayList<>();
for (MultipartFile fileTmp : file) {
try {
byte[] bytes1 = IOUtils.toByteArray(fileTmp.getInputStream());
list.add(bytes1);
} catch (Exception e) {
log.error("Failed to convert image stream to byte array:{}", e);
}
}
qiniuService.uploadImageToQiniu(list, fileNameList, user, idNoValidParam);
傳入異步線程進行上傳,此處上傳到七牛雲服務

@Async
public void uploadImageToQiniu(List<Object> list, List<String> fileNameList, User user,IdNoValidParam idNoValidParam ) {
String qiNiuUrl = syscodeService.getValueByKey(Constants.QINGNIU_URL);
//上傳圖片到qiniu cloud
for (Object object:list) {
byte[] bytes = (byte[]) object;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
try {
ImageUtils imageUtils = new ImageUtils();
imageUtils.saveImgToQiNiu(byteArrayInputStream, fileNameList);
log.info("upload image successfully{}");
} catch (IOException e) {

log.error("save image error {}", e);

}
}

}

————————————————
版權聲明:本文為CSDN博主「hanruikai」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/hanruikai/article/details/80366438


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM