后台響應頭: 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