servlet實(shí)現(xiàn)文件下載所需步驟及說(shuō)明,供大家參考,具體內(nèi)容如下
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、汾陽(yáng)ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的汾陽(yáng)網(wǎng)站制作公司
參考文章:Servlet實(shí)現(xiàn)文件下載功能
1.原理介紹:
Web容器為Servlet生成并且傳遞的HttpServletResponse對(duì)象不僅可以返回HTML文本,而且可以返回任何主流的其他文件格式,例如,.doc、.pdf、.jar、.avi等內(nèi)容格式的文件.這些類型內(nèi)容在HTTP協(xié)議中主要是體現(xiàn)在HTTP響應(yīng)消息中的消息頭部的content-type字段以及響應(yīng)有效負(fù)載中.
content-type是向?yàn)g覽器指明有效負(fù)載區(qū)里的內(nèi)容是某某類型的,例如:.jar類型的內(nèi)容.
而有效負(fù)載中的內(nèi)容就是目標(biāo)文件的字節(jié)集合,也就是二進(jìn)制內(nèi)容格式,而不是具體的類似于HTML的文本格式內(nèi)容.
因此,可以說(shuō)Servlet可以利用HttpServletResponse對(duì)象返回任何想要返回的內(nèi)容。
需要通過(guò)HttpServletResponse的實(shí)例去設(shè)置HTTP協(xié)議響應(yīng)消息消息頭部的一些屬性,這個(gè)是通過(guò)response.addHeader()或response.setHeader()或response.setIntHeader()函數(shù)來(lái)完成的。
這三個(gè)方法均有兩個(gè)參數(shù):第一個(gè)參數(shù)是屬性名,第二個(gè)參數(shù)是屬性值。
2.所需步驟:
2.1 response.setHeader("Content-Type","文件格式所對(duì)應(yīng)的內(nèi)容類型")
具體要根據(jù)國(guó)際標(biāo)準(zhǔn)的MIME屬性來(lái)制定,很多種格式的文件類型在MIME都會(huì)有對(duì)應(yīng),
如果直接通過(guò)URL來(lái)指定具體資源文件,則Apache服務(wù)器會(huì)根據(jù)服務(wù)器上的資源文件類型生成相應(yīng)的HTTP相應(yīng)消息的content-type類型,
但是如果不是直接通過(guò)URL指定資源文件,而是指向一個(gè)Servlet,則在Servlet內(nèi)部就需要通過(guò)代碼顯式來(lái)指定響應(yīng)消息中的content-type類型,否則不同種類的瀏覽器會(huì)有不同的動(dòng)作,也很有可能使瀏覽器崩潰。
2.2 response.setHeader("Content-Disposition","attachment;filename=" + 文件名稱)
指定文件保存的默認(rèn)命名,上例指定為utils.jar,是通過(guò)"content-disposition"屬性指定的,如果不指定則瀏覽器會(huì)默認(rèn)指定為當(dāng)前Servlet的URL名稱,例如CodeServlet.do,也就是說(shuō)擴(kuò)展名變成了.do而不是.jar.
2.3 獲取文件,并讀取文件
2.4 以字節(jié)流的方式返回頁(yè)面
實(shí)例:
/** * 處理文件下載的post * @throws IOException */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 1.獲得請(qǐng)求文件名 String fileName = request.getParameter("fileName"); // 2.設(shè)置文件MIME類型(指定要返回內(nèi)容的類型) response.setContentType(getServletContext().getMimeType(fileName)); // 3.設(shè)置Content-Disposition(指定下載該文件時(shí)的文件名) response.setHeader("content-disposition", "attachment;filename=" + fileName); // 4.讀取目標(biāo)文件,通過(guò)response將目標(biāo)文件寫到客戶端 // 4.1 獲取目標(biāo)文件的絕對(duì)路徑 String filePath = "WEB-INF/uploadFiles/" + fileName; filePath = this.getServletContext().getRealPath(filePath); // 4.2 讀取文件 InputStream in = new FileInputStream(filePath); // 4.3 輸出文件 OutputStream out = response.getOutputStream(); // 寫文件 int n; while ((n = in.read()) != -1) { out.write(n); } in.close(); out.close(); }
說(shuō)明:
1.所需jar包,版本不限
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
2.導(dǎo)包時(shí)不要導(dǎo)錯(cuò)了
import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;
3.更多對(duì)于文件的操作,請(qǐng)移步文章:servlet實(shí)現(xiàn)文件上傳,預(yù)覽,下載和刪除
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。