java——前台通過接口下載項目中的文件


 

后台響應頭:
response.setHeader("content-type", "application/octet-stream");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename=" + filename);
然后通過流進行下載:
os = response.getOutputStream();
bis = new BufferedInputStream(new FileInputStream(new File(path)));
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}

問題1.下載pptx文件,打開一直報文件模板損壞問題
原因:模板文件本身就有問題,打開另存為ppt解決。

問題2.本地開發環境下載正常,打包成jar在linux上下載失敗。
原因:打成jar包后,路徑不是從src開始而是直接從resource下開始。並且需要通過如下方式讀取文件:

Resource res = new ClassPathResource("template/..ppt");
InputStream is = res.getInputStream();
bis = new BufferedInputStream(is);

問題3.下載excel文件,報錯文件部門內容有問題需要修復。

原因:下載excel文件,response響應給前台,需要告訴前台是否已傳完,設置如下響應頭即可:

response.setHeader("Content-Length", String.valueOf(bis.available()));

問題4.加上content-length后,打包jar在linux服務器上,報文件已損壞

原因:打成jar包,無法一次性獲取流的大小,流大小可能為0,故導致content-length為0文件損壞

解決方式:在下載前,先請求獲取content-length的接口,通過:
Resource res = new ClassPathResource("template/..ppt");
InputStream is = res.getInputStream();
bis = new BufferedInputStream(is);
OutputStream os = new OutputStream...
IOUtils.copy(bis, os); copy后就返回輸入流的大小
return contentLength;
獲取到content-length,然后將獲取到的content-length作為參數,傳遞給下載的接口即可解決。

問題5:.springboot-導出項目路徑中的文件,使用前台請求,后台讀取文件,轉換為流,供前台下載。
打包后,下載失敗找不到路徑,原因,打包后,不是src項目路徑為:
BOOT-INF
——classes
——config
所以,下載要根據運行的環境變量來動態取路徑。

參考鏈接:https://blog.csdn.net/liubin5620/article/details/79530490
參考鏈接:https://blog.csdn.net/u013945868/article/details/79581979


免責聲明!

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



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