1. 程式人生 > >使用Servlet實現檔案下載

使用Servlet實現檔案下載

檔案下載

  • 直接在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();