天天看點

MultipartFile檔案上傳MultipartFile檔案上傳問題

MultipartFile檔案上傳問題

問題描述:

前端請求發送多檔案上傳,後端接收檔案時使用的是MultipartFile[ ] files,然後使用

BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(file)); out.write(file.getBytes());

将檔案流寫入到目标檔案中出現了

java.io.FileNotFoundException: /home/app/sxpservice/temp/upload_e46ffe57_8ee6_4353_b533_d57c040bbc60_00000000.tmp (No such file or directory)

分析:

上傳代碼并沒有問題,問題是檔案流資訊不存在。找到對應目錄也沒有對應的.tmp檔案存在。重新分析程式。檔案上傳是一個接口,在檔案上傳完之後該接口還需要處理檔案(pdf轉圖檔、圖檔識别等),由于pdf檔案太大各種轉換又太慢,故在該接口中使用了ThreadPoolTaskExecutor 線程池,可以定義方法執行異步任務,而請求接口馬上傳回。然後程式出錯中的問題在于請求線程建立了在tomcat預設的臨時檔案夾下面建立了.tmp檔案,然後請求線程結束,交由線程池的線程處理耗時的檔案處理工作,請求線程結束後其建立的.tmp檔案也會消失,是以等到線程池的處理方法開始處理檔案上傳的工作時,去對應的目錄下面尋找.tmp臨時檔案用來讀取檔案流就尋找不到了,是以就會報出上面的錯誤。

解決:

在使用線程時,一定要注意資源的性質,解決上面的問題就是在請求線程沒有結束時就将檔案上傳儲存到檔案夾中,然後再調用線程池的異步執行方法,這樣就不會出現上面的問題了,或者在請求線程執行時,自己建一個臨時檔案夾,将請求的上傳的檔案先儲存到自己的臨時檔案夾下面,然後在異步方法中通路自己的臨時檔案夾拿到檔案資訊。

繼續閱讀