一、超鏈接下載:
這種方式非常簡單,就是在超鏈接里面寫上即將下載的文件路徑,我這里將文件放在webapp下面的download文件夾里面:
<a href="download/notice1.pdf"></a>
但是有一個弊端就是,如果下載的文件可以直接被瀏覽器識別就會自動打開,比如.png,.pdf文件,如果是.zip等文件,則不會打開。
二、Servlet下載:
為了解決第一種方式的弊端,我們采取Servlet下載方式。
1.新建Servlet文件,可以命名為DownloadServlet,映射url是“/downloadServlet”,我的項目名稱是suiningAdmissions;
2.在DownloadServlet中加入以下內容,其中filename是你在下載的時候需要傳遞的參數,是你即將下載的文件的名稱;
package cn.itIcey.suining.web.servlet; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @WebServlet("/downloadServlet") public class DownloadServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲得請求文件名 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(); byte[] buffer = new byte[1024]; int len; //循環取出流中的數據 while((len = in.read(buffer)) != -1){ out.write(buffer,0,len); } in.close(); out.close(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
3.將下載鏈接重新設置,其中/suiningAdmission/downloadServlet是我創建的Servlet的映射路徑,注意一定要把前面的項目名稱加上去!filename后面的內容就是下載的文件名稱。
<a href="/suiningAdmissions/downloadServlet?filename=notice3.pdf"
4.於是就可以下載啦!