[理論知識]html
咱們在軟件開發工做中,會常常遇到須要提供用戶下載文件的狀況。下載文件通常有兩種實現方式,一種是超連接方式,一種是流下載方式。本文小博老師就爲你們分別演示下這兩種下載文件的方式。java
[步驟解讀一]超連接下載方式瀏覽器
超連接的下載方式相對比較簡單,就是設置超連接的href屬性直接指向要下載的文件地址便可,好比咱們新建一個jsp,提供用戶下載多種文件,核心代碼以下:app
<body>jsp
<a href="downloads/java.docx">Word文檔(博爲峯全棧Java課程)</a><br/><br/>測試
<a href="downloads/job.xls">Excel表格(博爲峯學員就業信息表)</a><br/><br/>code
<a href="downloads/atact.txt">Txt記事本(博爲峯各地中心聯繫方式)</a><br/><br/>htm
<a href="downloads/bwf_logo.png">PNG圖片文件(博爲峯Logo圖片)</a><br/><br/>對象
</body>blog
使用瀏覽器訪問頁面後,會發現Word文檔和Excel表格能夠下載,可是Txt記事本和PNG圖片點擊超連接後,並不會下載,而是頁面跳轉過去直接在瀏覽器中顯示Txt和圖片的內容了:
形成這個現象的緣由,是由於瀏覽器沒法直接識別.doc和.xls格式的文件,所以瀏覽器提供了用戶直接下載文件,可是瀏覽器是能夠直接識別.txt和.png格式的文件的,所以瀏覽器就會把它們當成頁面直接跳轉過去顯示了。這也是超連接方式下載文件的最大弊端,另外插一句,超連接方式下載文件還有一個弊端,那就是提供下載的文件地址路徑徹底暴露了出來,用戶能夠直接輸入要下載的文件路徑進行下載,這樣就很難實現一些業務邏輯處理,好比下載前查看用戶的積分是否達到了下載此文件所必要的積分,須要充值等等。
[步驟解讀二]流方式下載
接下來小博老師爲你們講解第二種下載文件方式,它的核心思路是,把須要下載的文件,用輸入流的方式打開而且讀取文件中的數據,而後將數據輸出響應給客戶端瀏覽器,而且設置響應的頭信息Content-type的值,從原來的text/html改成application/octet-stream,也就是告訴瀏覽器不要以text/html的方式解析響應數據了,要以輸出流的方式向客戶端輸出響應數據,這樣實現文件下載的效果。
咱們首先改變jsp文件,核心代碼以下:
<body>
<a href="BWFDownload?file=java.docx">Word文檔(博爲峯全棧Java課程)</a><br/><br/>
<a href="BWFDownload?file=job.xls">Excel表格(博爲峯學員就業信息表)</a><br/><br/>
<a href="BWFDownload?file=atact.txt">Txt記事本(博爲峯各地中心聯繫方式)</a><br/><br/>
<a href="BWFDownload?file=bwf_logo.png">PNG圖片文件(博爲峯Logo圖片)</a><br/><br/>
</body>
這樣修改後,全部的下載任務會請求到一個映射爲BWFDownload的Servlet上,而且把須要下載的文件名用GET方式傳遞給Servlet。接下來咱們就建立這個Servlet,核心代碼以下:
@WebServlet("/BWFDownload")
public class BWFDownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲取Get傳值 要下載的文件名稱
String file = request.getParameter("file");
// 實例化 SmartUpload 對象
SmartUpload upload = new SmartUpload();
// 初始化 SmartUpload對象 的參數
upload.initialize(getServletConfig(), request, response);
// 取消默認打開方式(text/html方式) 改變爲application/octet-stream方式
upload.setContentDisposition(null);
try {
// 響應輸出要下載的文件中的數據
upload.downloadFile("downloads/"+file);
} catch (SmartUploadException e) {
e.printStackTrace();
}
}
}
咱們再打開瀏覽器測試,全部類型的文件均可如下載成功了。