使用Servlet實現檔案下載
阿新 • • 發佈:2018-12-02
檔案下載
- 直接在html或jsp頁面寫入超連結
<!--點選後 瀏覽器可以解析的會自動開啟 不能解析度提示下載-->
<a href="專案名/資源路徑">資源路</a>
- 編寫檔案下載功能 即不讓瀏覽器解析
<!--前端頁面-->
<h1>使用伺服器端Servlet編碼實現檔案下載</h1>
<a href="/專案名/資源路徑?file=A.file">a.file</a><br />
<a href="/專案名/資源路徑?file=B.file" >b.file</a><br />
<a href="/專案名/資源路徑?file=C.file">c.file</a>
</h1>
//獲得要下載的檔案的名稱
String filename = request.getParameter("filename");//a.file
//要下載的這個檔案的型別 客戶端通過檔案的MIME型別(多功能Internet郵件擴充套件)去區分型別
response.setContentType(this.getServletContext().getMimeType(filename));
//tomcat->conf->web.xml 預定義好全部的 mime-mapping
//告訴客戶端該檔案不是直接解析 而是以附件形式開啟(下載)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//獲取檔案的絕對路徑
String path = this.getServletContext().getRealPath("download/"+filename);
//獲得該檔案的輸入流
InputStream in = new FileInputStream(path);
//獲得輸出流 通過response獲得的輸出流 用於向客戶端寫內容
ServletOutputStream out = response.getOutputStream();
//檔案拷貝的模板程式碼
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();//可省略 tomcat會檢查response是否關閉 沒關閉會幫你關閉
}
檔名為中文時
//獲得要下載的檔案的名稱
String filename = request.getParameter("filename");//????.file
//把請求傳入的字串 用ISO-8850-1解碼 在用UTF-8編碼 缺點:響應不出檔名
filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");//測試.file
//獲得請求頭中的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");
}
//要下載的這個檔案的型別 客戶端通過檔案的MIME型別(多功能Internet郵件擴充套件)去區分型別
response.setContentType(this.getServletContext().getMimeType(filename));
//告訴客戶端不要解析 而是下載 filename 的值 客戶端預設對其進行解碼
response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);
//獲取檔案的絕對路徑
String path = this.getServletContext().getRealPath("download/"+filename);
//獲得該檔案的輸入流
InputStream in = new FileInputStream(path);
//獲得輸出流 通過response獲得的輸出流 用於向客戶端寫內容
ServletOutputStream out = response.getOutputStream();
//檔案拷貝的模板程式碼
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();