隨便找一些文件,放在一個文件夾中(我的叫做download),然后復制粘貼到項目文檔中
可以看到,我在里面放了一些文件:a.jpg,b.txt和c.zip
接下來,寫一個簡單的html文件,作為頁面展示
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <h1>資源預覽</h1><br> <a href="download/a.jpg">攻略.jpg</a> <a href="download/b.txt">歌詞.txt</a> <a href="download/c.zip">壓縮包.zip</a><br> <h1>資源下載</h1><br> <a href="DownloadServlet?filename=a.jpg">攻略.jpg</a> <a href="DownloadServlet?filename=b.txt">歌詞.txt</a> <a href="DownloadServlet?filename=c.zip">壓縮包.zip</a> </body> </html>
資源預覽塊可以通過默認的DefaultServlet對文件進行查看,只需要資源預覽的html代碼運行即可進行查看,這個不多說,下面說下如何自己寫Servlet實現下載。
拿a.jpg的下載鏈接來說:
在超鏈接標記中寫入實現下載的Servlet的名稱(很顯然我的叫做DownloadServlet),用?號作為連接符給servlet傳過去filename=文件名
然后就是編寫Servlet了,繼續拿a.jpg來說,代碼如下:
import java.io.FileInputStream; 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; import com.sun.xml.internal.ws.encoding.soap.SOAP12Constants; //HttpServletRespose下載文件 @WebServlet("/DownloadServlet") public class DownloadServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.獲取要下載的文件名 -- 如:a.jpg String filename = request.getParameter("filename"); //2.獲取這個文件在tomcat服務器下的絕對路徑(點擊攻略.jpg即a.jpg后獲取到的路徑為:D:\eclipse-jee-luna-jdk8-tomcat8\eclipse-jee-luna-jdk8-tomcat8\tomcat-8.0.21\webapps\WebProjectTest\download\a.jpg) String path = this.getServletContext().getRealPath("/download/" + filename); //3.瀏覽器收到資源時,以下載的方式提醒用戶,而不是直接展示。關於getHeader的使用,下方有鏈接 response.setHeader("Content-Disposition", "attachment;filename=" + filename); //4.轉化為輸入流 InputStream is= new FileInputStream(path); //5.創建輸出流 OutputStream os = response.getOutputStream(); //6.讀寫數據 int len; byte[] bys = new byte[1024]; while((len = is.read(bys)) != -1){ os.write(bys, 0, len); } os.close(); is.close(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
運行tomcat,打開頁面后點擊下載鏈接,即可發現點擊鏈接后不再自動查看文件了,而是彈出瀏覽器的下載框。
其實這些代碼中,需要注意的地方就是getServletContext().getRealPath()的用法以及response.setHeader()的用法,前者自己試着獲取輸出一下很容易明白,setHeader的作用較多,不多說了,給一個鏈接有興趣的可以自己去看下,setHeader的用法非常全,下面是鏈接:
https://www.cnblogs.com/mingforyou/p/3281945.html
感謝寫這篇文章的殘星大佬,寫的真的很詳細。