jsp中通過資料流向用戶端傳送資料
來源:互聯網
上載者:User
js|用戶端|資料 jsp中通過資料流向用戶端傳送資料
/**
@作者 : 慈勤強
@Email : cqq1978@Gmail.com
*/
有人經常會問這樣一個問題:“伺服器端程式如何向用戶端輸出一個檔案,然後讓瀏覽器
開啟一個儲存檔案的對話方塊,來儲存這個檔案。” 當然了,一個很簡單的做法,就是做一個
串連,指向要輸出的檔案,比如 <a href="a.rar">下載a.rar</a>,這樣,當使用者點擊
串連的時候就會彈出IE的儲存檔案對話方塊,然後下載。
不過,這樣做有兩方面的缺陷:
一是,瀏覽器有時候會自作聰明,對於一些常見的檔案類型會調用相關的應用程式開啟,
比如,下載一個word文檔.doc檔案, 有時候瀏覽器會預設用word程式開啟它。
二是,就是防止盜鏈的問題。一個使用者可以直接通過url地址來隨意的引用這個檔案,造成
檔案的盜用。
現在,在jsp中就可以直接通過檔案流的方式向用戶端寫資料,類似於我們在asp中用到
的adodb.stream對象。這樣,我們就可以把我們需要保護的檔案放到Web根目錄以外的地方,
比如web根目錄在F:\tomcat\webapps\ROOT,而我們可以把檔案放到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();
%>
特別值得注意的一點就是: 這種方法是直接從檔案中讀取資料,然後輸出到用戶端。 所以在整個檔案中,不能再
向用戶端輸出任何資訊,因為通過別的方式輸出的資訊也會儲存在檔案中,這樣就破壞了檔案的結構了。比如,
<%符號前面出現的哪怕一個空格,一個斷行符號都不可以,所以千萬要小心。