簡單實現(xiàn)Servlet文件下載功能
Web容器為Servlet生成并且傳遞的HttpServletResponse對象不僅可以返回HTML文本,而且可以返回任何主流的其他文件格式,例如,.doc、.pdf、.jar、.avi等內容格式的文件.這些類型內容在HTTP協(xié)議中主要是體現(xiàn)在HTTP響應消息中的消息頭部的content-type字段以及響應有效負載中.
content-type是想瀏覽器指明有效負載區(qū)里的內容是某某類型的,例如:.jar類型的內容.
而有效負載中的內容就是目標文件的字節(jié)集合,也就是二進制內容格式,而不是具體的類似于HTML的文本格式內容.
因此,可以說Servlet可以利用HttpServletResponse對象返回任何想要返回的內容,同時可以在確定要返回具體內容之前加入任何邏輯代碼,例如:判斷權限邏輯.也可以使用Servlet來動態(tài)創(chuàng)建用戶所需要的內容,或者說是要發(fā)回的是實時創(chuàng)建的字節(jié).
例如:有這樣一個系統(tǒng),你要從用戶得到輸入?yún)?shù),然后使用這些參數(shù)動態(tài)生成一個聲音,發(fā)送回去.原先是沒有這個聲音的,換句話說聲音并沒有座位一個文件放在服務器上,而當前的Servlet需要建立這樣一個聲音,然后把它放在響應中返回給客戶端.
具體代碼如下:
package down;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CodeServlet extends HttpServlet {
private static final long serialVersionUID = -2142723162865292420L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
response.setHeader("content-type", "application/jar");
response.addHeader("content-disposition", "attachment;filename=utils.jar");
ServletContext ctx = this.getServletContext();
InputStream is = ctx.getResourceAsStream("/utils.jar");
int read = 0;
byte[] bytes = new byte[1024];
OutputStream os = response.getOutputStream();
while((read = is.read(bytes)) != -1) {
os.write(bytes, 0, read);
}
os.flush();
os.close();
}
}
說明:
首先,需要通過HttpServletResponse的實例去設置HTTP協(xié)議響應消息消息頭部的一些屬性,這個是通過
response.addHeader()或response.setHeader()或response.setIntHeader()函數(shù)來完成的,兩個參數(shù),第一個參數(shù)是屬性名,第二個參數(shù)是屬性值,具體要根據(jù)國際標準的MIME屬性來制定,很多種格式的文件類型在MIME都會有對應,如果直接通過URL來指定具體資源文件,則Apache服務器會根據(jù)服務器上的資源文件類型生成相應的HTTP相應消息的content-type類型,但是如果不是直接通過URL指定資源文件,而是指向一個Servlet,則在Servlet內部就需要通過代碼顯式來指定響應消息中的content-type類型,否則不同種類的瀏覽器會有不同的動作,也很有可能使瀏覽器崩潰,(具體MIME常識見:MIME)
上例中,主要就是使返回類型指定為.jar類型格式.
而第二個addHeader是指定文件保存的默認命名,上例指定為utils.jar,是通過"content-disposition"屬性指定的,如果不指定則瀏覽器會默認指定為當前Servlet的URL名稱,例如CodeServlet.do,也就是說擴展名變成了.do而不是.jar.
剩下的代碼就是需要Java.io的知識了.
以下是從網(wǎng)上找到的一段代碼,具有一定的參考作用:
OutputStream o = response.getOutputStream();
byte b[] = new byte[500];
File fileLoad = new File("e:/tmpxls.xls");
response.reset();
//response.setCharacterEncoding("gb2312");
response.setContentType("application/vnd.ms-excel");
response
.setHeader("content-disposition", "attachment; filename=abc.xls");
long fileLength = fileLoad.length(); //這里的length()返回的是文件的長度,以字節(jié)為單位,Long類型
String length1 = String.valueOf(fileLength);
response.setHeader("Content_Length", length1); //content-length指的是有效負載的字節(jié)(Byte)長度
FileInputStream in = new FileInputStream(fileLoad);
int n;
while ((n = in.read(b)) != -1) {
o.write(b, 0, n);
}
in.close();
o.close();
另一個參考見博文:Content-Disposition使用方法和注意事項
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
MyBatis常用的jdbcType數(shù)據(jù)類型
這篇文章主要介紹了MyBatis常用的jdbcType數(shù)據(jù)類型的相關資料,需要的朋友可以參考下2016-12-12
詳解spring cloud hystrix請求緩存(request cache)
這篇文章主要介紹了詳解spring cloud hystrix請求緩存(request cache),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-05-05
詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務
這篇文章主要介紹了詳解SpringBoot開發(fā)案例之整合Dubbo分布式服務,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10
Java集合排序規(guī)則接口Comparator用法解析
這篇文章主要介紹了Java集合排序規(guī)則接口Comparator用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09
Spring Boot配置線程池拒絕策略的場景分析(妥善處理好溢出的任務)
本文通過實例代碼給大家介紹下如何為線程池配置拒絕策略、如何自定義拒絕策略。對Spring Boot配置線程池拒絕策略的相關知識感興趣的朋友一起看看吧2021-09-09
SpringBoot如何根據(jù)用戶系統(tǒng)時區(qū)動態(tài)展示時間
這篇文章主要介紹了SpringBoot如何根據(jù)用戶系統(tǒng)時區(qū)動態(tài)展示時間,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

