程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> JSP編程 >> 關於JSP >> jsp中通過數據流向客戶端傳送數據

jsp中通過數據流向客戶端傳送數據

日期:2017/1/18 10:26:06      編輯:關於JSP


jsp(SUN企業級應用的首選)中通過數據流向客戶端傳送數據

/**
@作者   : 慈勤強
@Email  : cqq1978@Gmail.com
*/



   有人經常會問這樣一個問題:“服務器端程序如何向客戶端輸出一個文件,然後讓浏覽器

打開一個保存文件的對話框,來保存這個文件。” 當然了,一個很簡單的做法,就是做一個

連接,指向要輸出的文件,比如 <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();
%>


特別值得注意的一點就是: 這種方法是直接從文件中讀取數據,然後輸出到客戶端。 所以在整個文件中,不能再


向客戶端輸出任何信息,因為通過別的方式輸出的信息也會保存在文件中,這樣就破壞了文件的結構了。比如,

<%符號前面出現的哪怕一個空格,一個回車都不可以,所以千萬要小心。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved