servlet實現(xiàn)文件下載的步驟及說明詳解
servlet實現(xiàn)文件下載所需步驟及說明,供大家參考,具體內(nèi)容如下
1.原理介紹:
Web容器為Servlet生成并且傳遞的HttpServletResponse對象不僅可以返回HTML文本,而且可以返回任何主流的其他文件格式,例如,.doc、.pdf、.jar、.avi等內(nèi)容格式的文件.這些類型內(nèi)容在HTTP協(xié)議中主要是體現(xiàn)在HTTP響應(yīng)消息中的消息頭部的content-type字段以及響應(yīng)有效負載中.
content-type是向瀏覽器指明有效負載區(qū)里的內(nèi)容是某某類型的,例如:.jar類型的內(nèi)容.
而有效負載中的內(nèi)容就是目標文件的字節(jié)集合,也就是二進制內(nèi)容格式,而不是具體的類似于HTML的文本格式內(nèi)容.
因此,可以說Servlet可以利用HttpServletResponse對象返回任何想要返回的內(nèi)容。
需要通過HttpServletResponse的實例去設(shè)置HTTP協(xié)議響應(yīng)消息消息頭部的一些屬性,這個是通過response.addHeader()或response.setHeader()或response.setIntHeader()函數(shù)來完成的。
這三個方法均有兩個參數(shù):第一個參數(shù)是屬性名,第二個參數(shù)是屬性值。
2.所需步驟:
2.1 response.setHeader("Content-Type","文件格式所對應(yīng)的內(nèi)容類型")
具體要根據(jù)國際標準的MIME屬性來制定,很多種格式的文件類型在MIME都會有對應(yīng),
如果直接通過URL來指定具體資源文件,則Apache服務(wù)器會根據(jù)服務(wù)器上的資源文件類型生成相應(yīng)的HTTP相應(yīng)消息的content-type類型,
但是如果不是直接通過URL指定資源文件,而是指向一個Servlet,則在Servlet內(nèi)部就需要通過代碼顯式來指定響應(yīng)消息中的content-type類型,否則不同種類的瀏覽器會有不同的動作,也很有可能使瀏覽器崩潰。
2.2 response.setHeader("Content-Disposition","attachment;filename=" + 文件名稱)
指定文件保存的默認命名,上例指定為utils.jar,是通過"content-disposition"屬性指定的,如果不指定則瀏覽器會默認指定為當前Servlet的URL名稱,例如CodeServlet.do,也就是說擴展名變成了.do而不是.jar.
2.3 獲取文件,并讀取文件
2.4 以字節(jié)流的方式返回頁面
實例:
/**
* 處理文件下載的post
* @throws IOException
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1.獲得請求文件名
String fileName = request.getParameter("fileName");
// 2.設(shè)置文件MIME類型(指定要返回內(nèi)容的類型)
response.setContentType(getServletContext().getMimeType(fileName));
// 3.設(shè)置Content-Disposition(指定下載該文件時的文件名)
response.setHeader("content-disposition", "attachment;filename=" + fileName);
// 4.讀取目標文件,通過response將目標文件寫到客戶端
// 4.1 獲取目標文件的絕對路徑
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();
}
說明:
1.所需jar包,版本不限
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
2.導包時不要導錯了
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.更多對于文件的操作,請移步文章:servlet實現(xiàn)文件上傳,預覽,下載和刪除
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient的ConnectionSemaphore方法源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12
Java大數(shù)據(jù)開發(fā)Hadoop?MapReduce
MapReduce的思想核心是“分而治之”,適用于大量復雜的任務(wù)處理場景(大規(guī)模數(shù)據(jù)處理場景)Map負責“分”,即把復雜的任務(wù)分解為若干個“簡單的任務(wù)”來并行處理??梢赃M行拆分的前提是這些小任務(wù)可以并行計算,彼此間幾乎沒有依賴關(guān)系2023-03-03

