java web實現檔案下載
阿新 • • 發佈:2018-11-17
javaweb實現檔案下載
- 實現檔案下載
- 解決下載檔名帶有中文亂碼問題
效果圖
實現思路
根據請求連接獲取檔名和檔案型別,設定響應頭,獲取輸入流和輸出流
核心程式碼
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String fileName = request.getParameter("fileName");
//獲得請求頭中的User-Agent
String agent = request.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" );
}
//告訴瀏覽器解析檔案的型別
response.setContentType(this.getServletContext().getMimeType(fileName));
//告訴瀏覽器不能解析檔案且適配各種瀏覽器提供檔案預設的名稱
response.setHeader("Content-Disposition", "attachment;filename="+fileNameEncoder);
String realPath = getServletContext().getRealPath(fileName);
InputStream in = new FileInputStream(realPath);
ServletOutputStream out = response.getOutputStream();
int len = 0;
byte[] bytes = new byte[1024];
while ((len = in.read(bytes)) > 0)
{
out.write(bytes, 0, len);
}
out.close();
in.close();
}
重點
- response.setHeader(“Content-Disposition”, “attachment;filename=”+fileNameEncoder); 實現強制下載
- response.setContentType(this.getServletContext().getMimeType(fileName)); 可以省略
- 解決檔名稱亂碼問題
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”);
}