1)什么情況下會(huì)文件下載莺褒?
瀏覽器不能解析的就文件下載
2)什么情況下需要在服務(wù)器上編寫文件下載代碼昔穴?
理論上暖侨,瀏覽器可以解析的代碼需要編寫文件下載代碼冬念。
實(shí)際開發(fā)中趁窃,只要是需要下載的文件都需要編寫文件下載代碼。
文件下載的實(shí)質(zhì)就是文件拷貝急前,將文件從服務(wù)器端拷貝到瀏覽器端醒陆。所以文件下載需要IO技術(shù)將服務(wù)器端的文件使用InputStream讀取到,在使用 ServletOutputStream寫到response緩沖區(qū)中
圖片從服務(wù)器端傳輸?shù)綖g覽器裆针,但瀏覽器直接解析圖片顯示在頁面上刨摩, 而不是提供下載,我們需要設(shè)置兩個(gè)響應(yīng)頭世吨,告知瀏覽器文件的類型和文件的打開方 式澡刹。
1)告知瀏覽器文件的類型:response.setContentType(文件的MIME類型);
2)告示瀏覽器文件的打開方式是下載:
response.setHeader("Content-Disposition","attachment;filename=文件名稱");
步驟:
1)獲得需要下載的文件名稱
String filename = request.getParameter("filename");
2)要下載的這個(gè)文件的類型-----客戶端通過文件的MIME類型去區(qū)分類型response.setContentType(this.getServletContext().getMimeType(filename));
3)告訴客戶端不是此文件不是直接解析,而是以附件形式打開(下載)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
4)獲得文件的絕對(duì)路徑
String path = this.getServletContext().getRealPath("download/"+filename);
5)獲得文件的輸入流
InputStream in = new FileInputStream(path);
6)獲得輸出流---通過response獲得輸出流耘婚,用于向客戶端寫內(nèi)容
ServletOutputStream out = response.getOutputStream();
7)文件拷貝的模板代碼
int len = 0;
byte[] buffer = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
8)最后需要關(guān)閉輸入與輸出流罢浇,輸入流為自己new的對(duì)象一定得手動(dòng)關(guān)閉,輸出流可以通過系統(tǒng)判斷自動(dòng)關(guān)閉
in.close();
//out.close();
servlet代碼:
public class DownloadServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//獲得需要下載的文件名稱
String filename = request.getParameter("filename");
//要下載的這個(gè)文件的類型-----客戶端通過文件的MIME類型去區(qū)分類型
response.setContentType(this.getServletContext().getMimeType(filename));
//告訴客戶端不是此文件不是直接解析沐祷,而是以附件形式打開(下載)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//獲得文件的絕對(duì)路徑
String path = this.getServletContext().getRealPath("download/"+filename);
//獲得文件的輸入流
InputStream in = new FileInputStream(path);
//獲得輸出流---通過response獲得輸出流嚷闭,用于向客戶端寫內(nèi)容
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();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
html代碼:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a>使用a標(biāo)簽指向服務(wù)器的資源</a><br>
<a href="/WEB14/download/a.flv">a.flv</a><br>
<a href="/WEB14/download/a.jpg">a.jpg</a><br>
<a href="/WEB14/download/a.mp3">a.mp3</a><br>
<a href="/WEB14/download/a.mp4">a.mp4</a><br>
<a href="/WEB14/download/a.txt">a.txt</a><br>
<a href="/WEB14/download/a.zip">a.zip</a><br>
<a>使用服務(wù)端編碼的方式實(shí)現(xiàn)文件下載</a><br>
<a href="/WEB14/downloadServlet?filename=a.flv">a.flv</a><br>
<a href="/WEB14/downloadServlet?filename=a.jpg">a.jpg</a><br>
<a href="/WEB14/downloadServlet?filename=a.mp3">a.mp3</a><br>
<a href="/WEB14/downloadServlet?filename=a.mp4">a.mp4</a><br>
<a href="/WEB14/downloadServlet?filename=a.txt">a.txt</a><br>
<a href="/WEB14/downloadServlet?filename=a.zip">a.zip</a><br>
</body>
</html>
但是,如果下載中文文件赖临,頁面在下載時(shí)會(huì)出現(xiàn)中文亂碼或不能顯示文件名的情況胞锰,原因是不同的瀏覽器默認(rèn)對(duì)下載文件的編碼方式不同,ie是UTF-8編碼方式兢榨,而火狐 瀏覽器是Base64編碼方式胜蛉。所里這里需要解決瀏覽器兼容性問題挠进,解決瀏覽器兼容 性問題的首要任務(wù)是要辨別訪問者是ie還是火狐(其他),通過Http請(qǐng)求體中的一個(gè)屬性可以辨別