1. 程式人生 > >直接讓瀏覽器下載檔案而不開啟

直接讓瀏覽器下載檔案而不開啟

直接讓客戶端瀏覽器下載已知型別(*.doc)的檔案  ,而不使用關聯程式開啟。
   
    Web開發人員都有過這樣的疑問,如何讓一個檔案,尤其是一個已知型別的檔案(*.doc),傳送到客戶端,直接提示讓瀏覽者下載,而不是用與它相關聯的程式開啟。

    以前我們最常用的辦法就是把這樣的檔案加到連結上,這樣可以讓瀏覽者通過點選滑鼠右鍵的目標另存為來下載所連結的檔案。但是,這樣有兩個不足的地方:  
    一是:如果瀏覽器能夠識別已下載檔案的副檔名,則瀏覽器就會啟用該副檔名所關聯的程式來開啟所下載的檔案。比如:在Windows平臺上,如果使用者點選的連結連結的是一個“.doc”檔案的話,那麼,瀏覽器就會啟動Microsoft   Word應用程式來開啟它。  
    二是:如果採用連結的辦法的話,任何能看到該連結的人都可以下載該檔案,你雖然也可以對所下載的檔案進行許可權設定,但那樣做也不是很方便的。有時候我們需要更為靈活和富有彈性的方式,下面的程式能夠很方便地克服以上兩方面的不足。  
    這種辦法是可靠的,但你必須記住:沒有授權的使用者不能夠通過在瀏覽器位址列裡輸入檔案的URL來取得該檔案的下載權。所以,要下載的檔案應該放到虛擬目錄之外的一個目錄裡,比如:如果你的虛擬目錄是C:\Mengxianhui\Tomcat4\Website\MyApp的話,那麼,存放在該目錄和該目錄下的任何子目錄下所有檔案對因特網上的任何使用者都是可見的。

    要直接下載一個檔案,我們需要做兩件事,

   第一件事是:設定響應的內容類為“application/octet-stream”,大小寫無關。

   第二件事是:設定HTTP的響應頭名字為:Content-Disposition,設定值為:attachment;   filename   =   theFileName。這裡的theFileName就是出現在檔案下載對話方塊裡的預設檔名,通常和所下載的檔名字相同,但也可以不同。

下面,我們就平常最常用的JSP和ASP頁面來舉一個實際應用的例子。  
     
      download.JSP頁面的例子:

      <%  
      //   得到檔名字和路徑  
      String   filename   =   "MengxianhuiDocTest.doc";  
      String   filepath   =   "D:\\";  
       
      //   設定響應頭和下載儲存的檔名  
      response.setContentType("APPLICATION/OCTET-STREAM");  
      response.setHeader("Content-Disposition",  
      "attachment;   filename=\""   +   filename   +   "\"");  
     
      //   開啟指定檔案的流資訊  
      java.io.FileInputStream   fileInputStream   =  
        new   java.io.FileInputStream(filepath   +   filename);  
         
      //   寫出流資訊  
      int   i;  
      while   ((i=fileInputStream.read())   !=   -1)   {  
        out.write(i);  
      }  
      fileInputStream.close();  
      out.close();  
    %>   
 

下載時被顯示的檔名包含中文時,要編碼
String filename=new String("手冊.pdf".getBytes("GBK"),"8859_1");

如果使用了Struts 2,可以參看: