Web開發人員都有過這樣的疑問,如何讓一個文件,尤其是一個已知類型的文件,發送到客戶端,直接提示讓瀏覽者下載,而不是用與它相關聯的程序打開。以前我們最常用的辦法就是把這樣的文件加到鏈接上,這樣可以讓瀏覽者通過點擊鼠標右鍵的目標另存為來下載所鏈接的文件。但是,這樣有兩個不足的地方:
一是:如果瀏覽器能夠識別已下載文件的擴展名,則瀏覽器就會激活該擴展名所關聯的程序來打開所下載的文件。比如:在Windows平臺上,如果用戶點擊的鏈接鏈接的是一個“.doc”文件的話,那么,瀏覽器就會啟動Microsoft Word應用程序來打開它。
二是:如果采用鏈接的辦法的話,任何能看到該鏈接的人都可以下載該文件,你雖然也可以對所下載的文件進行權限設置,但那樣做也不是很方便的。有時候我們需要更為靈活和富有彈性的方式,下面的程序能夠很方便地克服以上兩方面的不足。
這種辦法是可靠的,但你必須記住:沒有授權的用戶不能夠通過在瀏覽器地址欄里輸入文件的URL來取得該文件的下載權。所以,要下載的文件應該放到虛擬目錄之外的一個目錄里,比如:如果你的虛擬目錄是C:\Mengxianhui\Tomcat4\Website\MyApp的話,那么,存放在該目錄和該目錄下的任何子目錄下所有文件對因特網上的任何用戶都是可見的。要直接下載一個文件,我們需要做兩件事,第一件事是:設定響應的內容類為“application/octet-stream”,大小寫無關。第二件事是:設置HTTP的響應頭名字為:Content-Disposition,設定值為:attachment; filename = theFileName。這里的theFileName就是出現在文件下載對話框里的默認文件名,通常和所下載的文件名字相同,但也可以不同。下面,我們就平常最常用的JSP和ASP頁面來舉一個實際應用的例子。
TestFileDownload.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();
%>
值得注意的是:在你要下載的文件內容里,除了文件的內容之外,不應該再附加有其它任何的字符,包括空格和回車換行符。我們有時在編寫代碼的時候,為了使代碼清晰可讀,往往會添加一些空格、制表符或者回車換行符,這樣雖然看起來比較清晰,但有時可能會得不到正確的結果。比如:
<%@ page import="java.io.*"
%> <jsp:useBean id="MyBeanFromMengxianhui" scope="page"
class="com.Mengxianhui.DownloadBean" />
應該寫成這樣:
<%@ page import="java.io.*"%>
<jsp:useBean id="MyBeanFromMengxianhui" scope="page" class="com.Mengxianhui.DownloadBean" />
FeedBack:
# re: JSP 制作文件下載碰到的問題
2006-09-08 23:07 | JonneyQuest
只有注冊用戶登錄后才能發表評論。 | ||
![]() |
||
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關文章:
|
||
| |||||||||
日 | 一 | 二 | 三 | 四 | 五 | 六 | |||
---|---|---|---|---|---|---|---|---|---|
27 | 28 | 29 | 30 | 31 | 1 | 2 | |||
3 | 4 | 5 | 6 | 7 | 8 | 9 | |||
10 | 11 | 12 | 13 | 14 | 15 | 16 | |||
17 | 18 | 19 | 20 | 21 | 22 | 23 | |||
24 | 25 | 26 | 27 | 28 | 29 | 30 | |||
1 | 2 | 3 | 4 | 5 | 6 | 7 |
常用鏈接
留言簿(4)
隨筆分類(85)
隨筆檔案(89)
- 2009年8月 (1)
- 2008年7月 (1)
- 2007年11月 (1)
- 2007年8月 (1)
- 2007年7月 (2)
- 2007年6月 (1)
- 2007年2月 (5)
- 2007年1月 (1)
- 2006年12月 (1)
- 2006年11月 (1)
- 2006年10月 (11)
- 2006年9月 (28)
- 2006年8月 (9)
- 2006年7月 (12)
- 2006年6月 (3)
- 2006年5月 (1)
- 2006年4月 (3)
- 2006年3月 (4)
- 2006年2月 (3)
文章分類(14)
文章檔案(42)
- 2006年9月 (24)
- 2006年7月 (5)
- 2006年6月 (2)
- 2006年3月 (3)
- 2005年11月 (1)
- 2005年3月 (1)
- 2004年10月 (1)
- 2004年5月 (1)
- 2004年1月 (1)
- 2003年11月 (3)
收藏夾(37)
java
oracle
Sybase
搜索
積分與排名
- 積分 - 210988
- 排名 - 266
最新評論

- 1.?re: document.getElementsByName()的用法
- 455656
- --525233
- 2.?re: 討論:Java 接口當中的 “常量接口”
- 評論內容較長,點擊標題查看
- --maaoi
- 3.?re: document.getElementsByName()的用法
- 謝謝,很明了
- --sf
- 4.?re: Ant:編寫build.xml的方法
- 學習了
- --sss
- 5.?re: Java 堆與棧的使用
-
你是個sb嗎?
- --zr