關於單個文件或多個文件的上傳,上一篇博文已經記錄了下來,這次聊聊文件的下載。
——@Yelihu2018年9月20日 23:35:58
文件的下載還依然是使用MultipartFile這個組件,關於相關配置文件的配置,上一篇博文已經記錄,這裏就不在多贅述
功能實現的效果是,進入一個網頁的頁面,出來一個下載框,就可以下載一個指定的文件,這個文件暫時存放在本地的E盤之下,
實際開發的時候,關於文件的路徑和文件的名稱,還是要設置爲可配置的路徑和動態獲取的文件名,比如從數據庫中讀取出文件名和文件路徑,這個Demo裏面僅爲設置了讀取文件的路徑爲E盤。
代碼如下:
@RequestMapping(value="/downloadtest")
public String downloadtest(HttpServletResponse response){
//設置字符編碼
response.setCharacterEncoding("UTF-8");
//通過輸出流寫到客戶端
//獲取文件名字(全名+後綴)(實際開發中應該設置爲從數據庫中動態獲取)
String fileName = "2018線性代數輔導講義(湯家鳳) (1)1537405630070.pdf";
//通過Paths工具類獲取一個path對象
Path path = Paths.get(parentPath,fileName);
//判斷文件是否存在
if(Files.exists(path)){
System.out.println("文件存在!");
//存在就下載
//通過response設定他的相應類型
//獲取文件後綴
String fileSuffix =fileName.substring(fileName.lastIndexOf(".")+1);
//設置contentType,指定該響應類型 即可下載
response.setContentType("application/"+fileSuffix);
//重要!:根據HTTP協議的規範,添加頭信息,影響瀏覽器執行下載的行爲
try {
response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
//通過path寫入文件
try {
Files.copy(path,response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
}
}
//跳轉到響應頁面
return "system/plansubmit/download_success";
}
- 首先要字符編碼,不然會出現下載的文件文件名中中文部分爲空格。
response.setCharacterEncoding("UTF-8");
- 獲取文件名,我這裏直接定死了是E盤路徑下,叫做"2018線性代數輔導講義(湯家鳳) (1)1537405630070.pdf"的pdf文件
- 通過Path獲取一個path對象,構造一個Path對象來表示一個文件路徑,或者一個文件。
- 截取文件名稱的前綴(不包括.pdf部分)
- 判斷文件存在之後,根據HTTP協議所指定的響應類型(response.setContentType("application/"+fileSuffix);)
- 重要:根據HTTP協議的規範,添加頭信息,影響瀏覽器執行下載的行爲(response.addHeader("Content-Disposition","attachment;filename="+new String(fileName.getBytes("utf-8"),"ISO8859-1")); )
- 通過files下載文件
至此,在跳轉到的頁面上已經完全能下載到一個存在在E盤的這個指定的pdf文件了。
重點:響應類型的指定,和頭信息的指定