<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 42  文章 - 71  trackbacks - 0
    <2012年2月>
    2930311234
    567891011
    12131415161718
    19202122232425
    26272829123
    45678910

    常用鏈接

    留言簿

    隨筆檔案

    文章分類

    文章檔案

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    首先聲明,這個問題,只在IE6上會發(fā)生,IE8上是沒有此問題的,IE7未測試。
    IE6是一個很奇怪的東西,估計很多開發(fā)人員對于IE6是非常頭疼的。貌似微軟一向喜歡弄這樣的幺蛾子,就像當年的Microsoft JVM + Visual J++,雖然是好東西,但是由于未遵循標準規(guī)范,被Java組織給踢了出去,然后就不了了之了。

    現(xiàn)在的應(yīng)用中,文件下載的功能是很常見的。通常的做法是,文件被存放在服務(wù)器的某個路徑,然后由應(yīng)用去讀取文件,再通過設(shè)置響應(yīng)頭來讓瀏覽器進行響應(yīng)的動作。如果希望瀏覽器能夠識別文件名,通常的做法是設(shè)置響應(yīng)頭中的Content-Disposition屬性:

    response.setContentType("application/octet-stream");
    response.addHeader("Content-Disposition", "attachment; filename=xxx.xls");

    如果要能夠讓IE正確的處理中文文件名,則需要對中文文件名進行UTF-8編碼:
    response.addHeader("Content-Disposition", String.format("attachment;filename=%s", java.net.URLEncoder.encode("中文.xls", "UTF-8")));

    編碼后的“中文.xls”為:“%E4%B8%AD%E6%96%87.xls”。

    通常,這種模式是沒有問題的,但是如果文件名很長,就會出現(xiàn)“無法下載文件”的錯誤。

    經(jīng)過查找資料,在IE6上存在這樣的問題,微軟的文檔(http://support.microsoft.com/kb/816868?LN=en-us)中說:

    This behavior occurs because the content disposition header for the file stream is greater than approximately 150 bytes and the Latin character set is equal to 150 characters. This behavior may occur if the content disposition header is formatted with a non-Latin character set, such as Japanese or Russian.

    For example, a 17-character content disposition header in the Japanese character set is 153 bytes because the UTF-8 encoding scheme uses 9 bytes to represent a single Japanese character, but it uses only 1 byte in the Latin character set.

    也就是說,對于Content-Disposition這個響應(yīng)頭,IE6僅能處理150字節(jié)左右,再長了就處理不了了。對于如何解決這個問題,微軟的原文中也是閃爍其詞,說是有一個Hotfix,但是又說需要進一步測試……

    如何解決問題呢?嘗試在Web上放置一個很長中文名得文件,然后直接在IE6地址欄中輸入這個文件的全地址,下載、直接打開都是正常的。因為這種情況下,服務(wù)器給出的響應(yīng)中不包含Content-Disposition段,估計是瀏覽器發(fā)現(xiàn)這是一個二進制流,然后就將URL中后面的部分當做文件名,所以文件名的處理都是瀏覽器在本地完成的,所以就避免了上面文檔中提到的BUG。(此處純屬猜想)

    所以,解決的思路如下:
    1. 在頁面上生成的附件鏈接中,包含附件的ID信息以及文件名。例如:<a href="/web/attachmentDownload/id/attachmentName.zip">附件</a>
    2. 在服務(wù)器端做一個Servlet,映射到路徑 /attachmentDownload/*
    3. Servlet獲取到請求的URL,解析出附件的ID信息及文件名
    4. Servlet設(shè)置響應(yīng)頭 response.setContentType("application/octet-stream") ,或者設(shè)置成附件對應(yīng)的真實MIME-TYPE也可以。但是不設(shè)置Content-Disposition
    5. 根據(jù)ID讀取文件,向響應(yīng)中寫入文件流
    6. flush

    測試了一下,是有效的一個辦法。但是為神馬覺得這個解決辦法奇怪的很?簡直有點不像正常人類的思維方式了-_-|||
    就這樣吧,神馬都是浮云!

    posted on 2012-02-29 21:45 YODA 閱讀(1434) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲日韩国产二区无码| xvideos永久免费入口| 国产高清在线免费视频| 七次郎成人免费线路视频| 亚洲精品美女久久久久99| 亚洲第一网站免费视频| 免费大片黄在线观看| 久久亚洲精精品中文字幕| 免费看www视频| 国产一区二区免费视频| 亚洲午夜无码久久久久小说| 亚洲午夜日韩高清一区 | 一二三四影视在线看片免费 | 91成人免费在线视频| 免费一级毛片在线播放视频免费观看永久 | 日韩在线永久免费播放| 蜜芽亚洲av无码一区二区三区| 亚洲av午夜福利精品一区人妖| 免费无码又爽又刺激高潮 | 国产在线观看免费不卡| 99热精品在线免费观看| 天堂亚洲免费视频| 亚洲jjzzjjzz在线观看| 亚洲国产精品一区二区第一页| 暖暖在线日本免费中文| 中文字幕天天躁日日躁狠狠躁免费| 老司机午夜在线视频免费观| 亚洲欧洲国产成人精品| 国产亚洲一区二区三区在线观看| 日日AV拍夜夜添久久免费| 0588影视手机免费看片| a级毛片免费高清毛片视频| 国产精品亚洲综合网站| 国产精品亚洲综合五月天| 亚洲AV成人无码久久精品老人| 亚洲成人一区二区| 成年女人免费视频播放体验区| 久久午夜伦鲁片免费无码| 国产免费人成视频尤勿视频| 色窝窝亚洲av网| 亚洲色大成网站www|