解決使用Spring Boot、Multipartfile實現上傳報錯FileNotFoundException

前言

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", "文件上傳失敗, 請重試");
  }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章