對Servlet的響應,以告知瀏覽器下載文件:
需要對http響應協議設置:
1:設置響應頭--內容接收程序--瀏覽器看到這個響應頭,就會把它認爲的下載程序打開
(如果識別迅雷那麼就會自動打開迅雷,如果沒有其它的則打開一個“文件另存爲”的對話框
response.setContentType("application/force-download");
2:設置響應頭--告訴瀏覽器:文件名+文件類型
String fileName = "歡迎文件名.jpg";
response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\"");//注意,“attachment;” 不能少,否則瀏覽器會直接在新窗口中打開
3:上面的fileName會亂碼,在setheader前解決中文文件名亂碼問題
適用於ie/360等瀏覽器。
fileName = URLEncoder.encode(fileName,"utf-8");
火狐設置:
fileName=new String(fileName.getBytes("utf-8"), "ISO8859-1");
4:向瀏覽器發送要下載的文件數據
String realPath = getServletContext().getRealPath("/imgs/1.jpg");//真正下載的文件數據在這裏
InputStream in = new FileInputStream(realPath);
OutputStream out = response.getOutputStream();
byte buf[] = new byte[1024];
int len=0;
while( (len=in.read(buf))!=-1){
out.write(buf, 0, len);
}
完整的程序(實現多瀏覽器支持):public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/force-download");
response.setCharacterEncoding("utf-8");
String fileName="圖片下載.gif";
if(request.getHeader("user-agent").contains("Firefox"))//判斷是否爲火狐
fileName=new String(fileName.getBytes("utf-8"), "ISO8859-1");
else
fileName=URLEncoder.encode(fileName, "utf-8");
response.setHeader("Content-Disposition", "attachment;filename=\""+fileName+"\"");
String filePath=getServletContext().getRealPath("/images/no laugh.gif");
OutputStream out=response.getOutputStream();
byte[] buf=new byte[1024];
FileInputStream fin=new FileInputStream(new File(filePath));
int len=0;
while((len=fin.read(buf))!=-1){
out.write(buf, 0, len);
}
fin.close();out.flush();out.close();
}