http://blog.csdn.net/longshengguoji/article/details/39433307
需求:實現一個具有文件下載功能的網頁,主要下載壓縮包和圖片
兩種實現方法:
一:通過超鏈接實現下載
在HTML網頁中,通過超鏈接鏈接到要下載的文件的地址
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <h1>通過鏈接下載文件</h1>
- <a href="/day06/download/cors.zip">壓縮包</a>
- <a href="/day06/download/1.png">圖片</a>
- </body>
- </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>通過鏈接下載文件</h1> <a href="/day06/download/cors.zip">壓縮包</a> <a href="/day06/download/1.png">圖片</a> </body> </html>
其中day06/download是文檔路徑,本實例的程序結構如下:

程序運行后,可以通過單擊需要下載文檔實現下載

但是這里會出現一個問題,就是單擊下載壓縮包的時候會彈出下載頁面,但是下載圖片的時候瀏覽器就直接打開了圖片,沒有下載。

這是因為通過超鏈接下載文件時,如果瀏覽器可以識別該文件格式,瀏覽器就會直接打開。只有瀏覽器不能識別該文件格式的時候,才會實現下載。因此利用第二種方法實現下載功能。
二:通過Servlet程序實現下載
通過Servlet下載文件的原理是通過servlet讀取目標程序,將資源返回客戶端。
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <h1>通過鏈接下載文件</h1>
- <a href="/day06/download/cors.zip">壓縮包</a>
- <a href="/day06/download/1.png">圖片</a>
- <h1>通過servlet程序下載文件</h1>
- <a href="/day06/ServletDownload?filename=cors.zip">壓縮包</a>
- <a href="/day06/ServletDownload?filename=1.png">圖片</a>
- </body>
- </html>
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>通過鏈接下載文件</h1> <a href="/day06/download/cors.zip">壓縮包</a> <a href="/day06/download/1.png">圖片</a> <h1>通過servlet程序下載文件</h1> <a href="/day06/ServletDownload?filename=cors.zip">壓縮包</a> <a href="/day06/ServletDownload?filename=1.png">圖片</a> </body> </html>
其中,/day06/ServletDownload 是servlet程序的映射路徑
然后新建一個servlet,名稱為ServletDownload,URL映射為/ServletDownload

添加代碼如下:
- package com.lsgjzhuwei.servlet.response;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import javax.servlet.ServletException;
- import javax.servlet.annotation.WebServlet;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * Servlet implementation class ServletDownload
- */
- @WebServlet(asyncSupported = true, urlPatterns = { "/ServletDownload" })
- public class ServletDownload extends HttpServlet {
- private static final long serialVersionUID = 1L;
- /**
- * @see HttpServlet#HttpServlet()
- */
- public ServletDownload() {
- super();
- // TODO Auto-generated constructor stub
- }
- /**
- * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
- //獲得請求文件名
- String filename = request.getParameter("filename");
- System.out.println(filename);
- //設置文件MIME類型
- response.setContentType(getServletContext().getMimeType(filename));
- //設置Content-Disposition
- response.setHeader("Content-Disposition", "attachment;filename="+filename);
- //讀取目標文件,通過response將目標文件寫到客戶端
- //獲取目標文件的絕對路徑
- String fullFileName = getServletContext().getRealPath("/download/" + filename);
- //System.out.println(fullFileName);
- //讀取文件
- InputStream in = new FileInputStream(fullFileName);
- OutputStream out = response.getOutputStream();
- //寫文件
- int b;
- while((b=in.read())!= -1)
- {
- out.write(b);
- }
- in.close();
- out.close();
- }
- /**
- * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
- */
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
- }
- }
package com.lsgjzhuwei.servlet.response; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDownload */ @WebServlet(asyncSupported = true, urlPatterns = { "/ServletDownload" }) public class ServletDownload extends HttpServlet { private static final long serialVersionUID = 1L; /** * @see HttpServlet#HttpServlet() */ public ServletDownload() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub //獲得請求文件名 String filename = request.getParameter("filename"); System.out.println(filename); //設置文件MIME類型 response.setContentType(getServletContext().getMimeType(filename)); //設置Content-Disposition response.setHeader("Content-Disposition", "attachment;filename="+filename); //讀取目標文件,通過response將目標文件寫到客戶端 //獲取目標文件的絕對路徑 String fullFileName = getServletContext().getRealPath("/download/" + filename); //System.out.println(fullFileName); //讀取文件 InputStream in = new FileInputStream(fullFileName); OutputStream out = response.getOutputStream(); //寫文件 int b; while((b=in.read())!= -1) { out.write(b); } in.close(); out.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
重啟tomcat服務器,即可實現對壓縮包和對圖片的下載。

