JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Servlet/JSP 討論區  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友   
reply to topicthreaded modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Http 檔案下載的補述(幾點實作的經驗) [精華]
精靈





發文: 86
積分: 7
於 2004-04-17 01:30 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在論壇裡,已經有先進說明過如何在 Servlet / JSP 中,利用 HTTP Protocol 實作動態的檔案下載服務。這一項功能個人在系統開發中,用的很多,也遇到過幾個問題,想將這些經驗分享給大家,希望對大家能有幫助。

1. MS IE 版本的問題
1
2
3
4
5
6
7
8
9
10
 if (request.getHeader("User-Agent").indexOf("MSIE 5.5") != -1) {
    // MS IE5.5 有要作特別處理
    response.setHeader("Content-Disposition","filename="
            + new String( f_name.getBytes("Big5"), "ISO8859_1" ) );
  }
  else {
    // 非 IE5.5 的 Header 設定方式
    response.addHeader( "Content-Disposition", "attachment;filename="
          + new String( f_name.getBytes("Big5"), "ISO8859_1" ) );
  }

IE 5.5 不能加上 attachment 這個關鍵字,這是很奇怪的一個版本。

2. 下載中文檔名,如前程式區塊中的語法,其實很簡單就可以作到,只要將檔名改成 "ISO8859_1" 的編碼就可以,我測過 Tomcat , Oracle 9ias, Sun One 都可以正常的下載中文檔名,而且,這樣寫法,好處是無需外加任何的 package。

3. 檔案下載完畢之後,最好加上以下這二行指令:
1
2
  response.setStatus( response.SC_OK );
  response.flushBuffer();

以前沒有加這二行,常常可以在 error.log 裡看到 "Connection rest by peer " 這樣的錯誤訊息,而且,更嚴重的是執行下載的 servlet / jsp 不會結束,要等相當長的時間才會 Timeout,如果下載的次數一多,AP Server 就慘了,所以,有作動態下載檔案的程式,最好還是加上這二行指令。

4. 安全性考量,有時候寫程式偷懶,會採用 dumpfile.jsp?f_name=attach/a.txt 這樣的方式來處理檔案下載。如果,在程式中沒有過濾掉上傳檔案名稱參數中,不可夾雜 ".." 的話,試想,如果有人故意將參數改成這樣呢 ? dumpfile.jsp?f_name=../../../a.txt,嘿嘿嘿,整個系統的所有檔案就任人下載啦。

以上,都是個人曾經犯過的錯誤,給大家參考。


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
精靈





發文: 86
積分: 7
於 2004-04-17 01:47 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
對了,補述一點,在處理中文檔名時,我早前曾試過採用 new String( f_name.getBytes("Big5"), "UTF-8" ),中文是沒問題啦,但是,檔名太長就不行,原因我不太清楚,只知道當檔案名稱超過不太了的長度時,檔名會被截掉。

也試過 URLEncode( f_name ),會有二個問題,一是用線上開啟時,檔名會變成 %A1D%D2C%..............................doc 一大串的 URL 編碼,很討厭。二是檔名中如果有空白,會被轉成 "+" 這個符號。

最後,採用 new String( f_name.getBytes("Big5"), "ISO8859_1" ) );,所有的問題就全消失了。


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
lianan





發文: 20
積分: 0
於 2004-04-28 11:12 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你好:
我想請問一下有關中文檔名的問題
目前我遇到的問題是會變成亂碼..
也有參考上面的方法
但還是一樣...有點奇怪..
不過我是在做檔案上傳的部份會變亂碼...檔案下載是不會..

檔案上傳是用HttpClient的MultipartPostMethod
將要上傳的檔案名稱傳到server端利用servlet再處理
servlet那邊是用Oreilly的MultipartRequest 來處理
在這行時就出現問題..MultipartRequest multi = new MultipartRequest(request, ".", 25 * 1024 * 1024)
出現filenotfoundexception..因為中文檔名會變成?,EX:檔案.txt->??.txt

檔案下載是用HttpClient的PostMethod
將檔名利用java.net.URLEncoder.encode(檔名,"UTF-8")轉成url接受的格式
這樣就沒問題了

想請問一下精靈兄是施了什麼魔法...而成功了?....
謝謝~~

PS:我的jsp都是存成U8-DOS格式..charset=UTF-8


lianan edited on 2004-04-28 16:28
reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
精靈





發文: 86
積分: 7
於 2004-04-29 10:44 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
檔案上傳與下載是完全不同的問題哦,有關檔案上傳的功能,因為大家所用的 Package 都不同,很難提供解決方案,只能建議你在 HttpClient的MultipartPostMethod 時,試試將檔名轉成 ISO8859-1 或 UTF-8 試試看。

reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:lianan]
AdaHsu





發文: 25
積分: 0
於 2004-04-29 17:26 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
lianan wrote:
servlet那邊是用Oreilly的MultipartRequest 來處理
在這行時就出現問題..MultipartRequest multi = new MultipartRequest(request, ".", 25 * 1024 * 1024)
出現filenotfoundexception..因為中文檔名會變成?,EX:檔案.txt->??.txt

檔案下載是用HttpClient的PostMethod
將檔名利用java.net.URLEncoder.encode(檔名,"UTF-8")轉成url接受的格式
這樣就沒問題了

PS:我的jsp都是存成U8-DOS格式..charset=UTF-8


MultipartRequest 在收到檔案名稱時,是認為上傳的檔名應該都是以 ISO8859-1 方式加以編碼,所以會造成檔案系統的錯亂。那時我是直接改 MultipartRequest 的 Source ,直接指定成 Big5 編碼的方式來解決的....


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
leonwang





發文: 1
積分: 0
於 2004-11-30 17:17 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
精靈兄的方法真是太棒了...

謝謝您的提供


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
themaster390





發文: 4
積分: 0
於 2005-04-22 16:31 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
太感謝了
找了很久 都無法解決
沒想到這麼簡單就解決了
程式設計果然很深奧


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
Jill_Yeh

眾裡尋他千百度



發文: 89
積分: 0
於 2005-04-24 23:47 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
嗯, 以前根據這篇文章, 真是幫了我一個大忙 Big Smile

不過, 由於之前的環境都是在 IE 下, 沒有發現特別的問題
最近改用 Firefox 測試時, 卻發現, 下載的檔名不會自己轉換 Dead

也就是說, 假設用 Download.do, IE 可以自動變成 [檔名.副檔名]
但是 Firefox 仍舊以 Download.do 的檔名下載

我試過一個, 無論有無 attachment; Firefox 依舊不理我 Dead
不知各位有無解法?


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
karry





發文: 244
積分: 2
於 2005-07-08 13:41 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
精靈 wrote:

最後,採用 new String( f_name.getBytes("Big5"), "ISO8859_1" ) );,所有的問題就全消失了。

請問一下, 若檔名有可能是簡體字, 若是繁簡混合時, 該怎麼辦??


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
ntsky





發文: 1
積分: 0
於 2006-01-11 17:16 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
你的系统是以utf-8编码的,就采用如下
new String( f_name.getBytes("utf-8"), "ISO8859_1" ) );


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
tealeaves





發文: 9
積分: 0
於 2009-05-18 17:34 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
若 f_name 原本即是存UTF-8
經測試如下即可
new String(f_name.getBytes(), "ISO8859_1" ) 正確
new String(f_name.getBytes("UTF-8"), "ISO8859_1" ) 出錯


reply to postreply to post
作者 Re:Http 檔案下載的補述(幾點實作的經驗) [Re:精靈]
Kirpheaice





發文: 6
積分: 0
於 2011-04-21 17:27 user profilesend a private message to userreply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
在此跟各位分享一下,我用getByte轉來轉去,始終搞不定,
後來看到這篇之後,照著去改server.xml就ok了,分享給將來有需要的人。
謝謝。

http://www.javaworld.com.tw/jute/post/view?bid=6&id=12735&tpg=1&ppg=1&sty=0#295823


reply to postreply to post
Kirpheaice@Relax@巴納札爾
» JWorld@TW »  Servlet/JSP 討論區

reply to topicthreaded modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8