jsp(SUN企業級應用的首選)中通過數據流向客戶端傳送數據
/**
@作者 : 慈勤強
@Email : [email protected]
*/
有人經常會問這樣一個問題:“服務器端程序如何向客戶端輸出一個文件,然後讓浏覽器
打開一個保存文件的對話框,來保存這個文件。” 當然了,一個很簡單的做法,就是做一個
連接,指向要輸出的文件,比如 <a href="a.rar">下載a.rar</a>,這樣,當用戶點擊
連接的時候就會彈出IE的保存文件對話框,然後下載。
不過,這樣做有兩方面的缺陷:
一是,浏覽器有時候會自作聰明,對於一些常見的文件類型會調用相關的應用程序打開,
比如,下載一個word文檔.doc文件, 有時候浏覽器會默認用word程序打開它。
二是,就是防止盜鏈的問題。一個用戶可以直接通過url地址來隨意的引用這個文件,造成
文件的盜用。
現在,在jsp(SUN企業級應用的首選)中就可以直接通過文件流的方式向客戶端寫數據,類似於我們在asp中用到
的adodb.stream對象。這樣,我們就可以把我們需要保護的文件放到Web根目錄以外的地方,
比如web根目錄在F: omcat(一個很好用的JSP運行平台)webappsROOT,而我們可以把文件放到f:software目錄
下,這樣別人就沒有辦法通過調用url來下載文件了。
好了,下面我們就來看看代碼如何編寫。
首先,設置一下response對象的contenttype為 APPLICATION/OCTET-STREAM;
接著,設置response對象的http header屬性 Content-Disposition 為一個文件名,
比如: attachment; filename="a.rar" ,其中的filename是“另存為”對話框出現的
文件名。
最後,就要用 FileInputStream 對象從文件中讀取數據,然後輸出。
具體例子為:
<%
String filename = "JavaFlash.rar";
String filepath = "f:\";
response.setContentType("APPLICATION/OCTET-STREAM");
response.setHeader("Content-Disposition","attachment; filename="a.rar"");
java.io.FileInputStream fileInputStream =new java.io.FileInputStream(filepath+filename);
int i;
while ((i=fileInputStream.read()) != -1) {
out.write(i); }
fileInputStream.close();
out.close();
%>
特別值得注意的一點就是: 這種方法是直接從文件中讀取數據,然後輸出到客戶端。 所以在整個文件中,不能再
向客戶端輸出任何信息,因為通過別的方式輸出的信息也會保存在文件中,這樣就破壞了文件的結構了。比如,
<%符號前面出現的哪怕一個空格,一個回車都不可以,所以千萬要小心。