小博老師解析Java核心技術點——文件下載技術

[理論知識]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();

}

}

}

咱們再打開瀏覽器測試,全部類型的文件均可如下載成功了。

相關文章
相關標籤/搜索