## 前台頁面
文件下載只需要在前端頁面,(解決了中文文件名不能傳輸)
跳到對應的controller, 參數跟上文件名fileName
<a href="/ssm_kgc/fileDownload?fileName=宏宏.jpg">下載</a>
## 后台java代碼
/**
* 文件下載,只需要傳入對應文件名字
*/
@RequestMapping("/fileDownload")
public void fileDownload(
@RequestParam(value = "fileName",required = false)String fileName,
HttpServletRequest req,
HttpServletResponse resp,
HttpSession session) throws Exception {
/*******************1.接收請求參數***********************************/
//獲取文件名,接收文件名參數
/*******************2.對接收的參數進行編碼處理**************************/
/**因為使用的是UTF-8的編碼形式,所以不需要進行轉碼**/
//獲取參數 ,默認會對參數進行編碼 ISO8859-1
//把亂碼轉回二進制位
// byte[] bytes = name.getBytes("ISO8859-1");
//再去使用UTF-8進行編碼
// name = new String(name.getBytes(),"UTF-8");
/*******************3.告訴瀏覽器響應的文件的類型*************************/
// 根據文件名來獲取mime類型
String mimeType = session.getServletContext().getMimeType(fileName);
// 設置 mimeType
resp.setContentType(mimeType);
/*******************4.告訴瀏覽器以附件的形式下載*************************/
// 獲取客戶端信息
String agent = req.getHeader("User-Agent");
// 定義一個變量記錄編碼之后的名字
String filenameEncoder = "";
if (agent.contains("MSIE")) {
// IE編碼
filenameEncoder = URLEncoder.encode(fileName, "utf-8");
filenameEncoder = filenameEncoder.replace("+", " ");
} else if (agent.contains("Firefox")) {
// 火狐編碼
BASE64Encoder base64Encoder = new BASE64Encoder();
filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(fileName.getBytes("utf-8")) + "?=";
} else {
// 瀏覽器編碼
filenameEncoder = URLEncoder.encode(fileName, "utf-8");
}
// 告訴瀏覽器是以附件形式來下載 不要解析
resp.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);
/*******************5.輸出對應的流*************************/
//獲取文件的絕對路徑,拼接文件的路徑
String path = session.getServletContext().getRealPath("download/" + fileName);
System.out.println("下載文件的路徑" + path);
//寫入流中
FileInputStream is = new FileInputStream(path);
//獲取相應的輸出流
ServletOutputStream os = resp.getOutputStream();
byte[] b = new byte[1024];
int len;
//寫入瀏覽器中
while((len = is.read(b)) != -1){
os.write(b, 0, len);
}
//關閉對應的流
os.close();
is.close();
}