Servlet——使用http響應頭Content-Disposition下載檔案的示例
阿新 • • 發佈:2019-01-02
專案目錄如上所示,圖片jpg和音樂mp3存在web應用中,而影音mp4不在web應用目錄中。
首先,寫了一個簡單的下載頁面download.html,提供下載連結,如下:
<!DOCTYPE html> <html> <head> <title>Download</title> <meta name="keywords" content="keyword1,keyword2,keyword3"> <meta name="description" content="this is my download page"> <meta name="content-type" content="text/html; charset=gbk"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body> <h1>下載列表</h1> <hr> <h2>音樂</h2> <ul> <li><a href="/DownFileTest/DownFileServlet?filename=Avicii Conrad Sewell - Taste the Feeling.mp3">Avicii Conrad Sewell - Taste the Feeling</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Madonna - Living For Love.mp3">Madonna - Living For Love</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Sam Smith - Lay Me Down.mp3">Sam Smith - Lay Me Down</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Tanaki Alison - Reach Higher.mp3">Tanaki Alison - Reach Higher</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Tep No - Me And My Guitar.mp3">Tep No - Me And My Guitar</a></li> </ul> <hr> <h2>圖片</h2> <ul> <li><a href="/DownFileTest/DownFileServlet?filename=cat (1).jpg">cat (1)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (2).jpg">cat (2)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (3).jpg">cat (3)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (4).jpg">cat (4)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (5).jpg">cat (5)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (6).jpg">cat (6)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (7).jpg">cat (7)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (8).jpg">cat (8)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (9).jpg">cat (9)</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=cat (10).jpg">cat (10)</a></li> </ul> <hr> <h2>影音</h2> <ul> <li><a href="/DownFileTest/DownFileServlet?filename=Kawhi Leonard Career Big Movie - Evolving In Silence.mp4">Kawhi Leonard Career Big Movie - Evolving In Silence</a></li> <li><a href="/DownFileTest/DownFileServlet?filename=Monkey.King.Hero.is.Back.2015.mp4">Monkey.King.Hero.is.Back.2015</a></li> </ul> </body> </html>
注意到,所有的下載連結都指向了/DownFileTest/DownFileServlet,並且後面跟著filename這個引數。
該頁面執行結果如下所示:那麼,DownFileServlet.java如下所示:
此時示例已經完成,每一次請求DownFileServlet,該Servlet都通過request得到filename這個引數的值,並判斷後綴來得到資源的全路徑,然後通過位元組流傳遞給客戶端。package com.gavin.download; import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DownFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); // request通過getParameter得到filename這個引數的值 String filename = request.getParameter("filename"); System.out.println(filename); // response設定Content-Disposition response.setHeader("Content-Disposition", "attachment;filename="+filename); String path = null; // jpg和mp3都存在於web應用目錄下,mp4則存在於F盤的movie資料夾下 // 如果是jpg或者mp3則通過它們的相對路徑得到絕對路徑 if(filename.endsWith("jpg")){ path= this.getServletContext().getRealPath("/images/"+filename); }else if (filename.endsWith("mp3")){ path= this.getServletContext().getRealPath("/musics/"+filename); }else if(filename.endsWith("mp4")){ path = "F:\\movie\\"+filename; } FileInputStream fis = new FileInputStream(path); byte buff[] = new byte[2048]; int len = 0; OutputStream os = response.getOutputStream(); while((len = fis.read(buff))>0){ os.write(buff, 0, len); } os.close(); fis.close(); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doGet(request, response); } }