網友帆問了一個好問題: 他提到用Response.AddHeader("content-disposition", "attachment;filename=" & HttpUtility.UrlEncode(filename))的方式指定下載檔名稱,會發生另存新檔(Save)時可存成中文檔名,但如果選擇開啟(Open),直接用Excel等程式開啟時,檔名會呈現%e4%b8...這種UrlEncode的形式。

這是一個好問題的原因是我也被它困擾很久了,最後選擇把頭埋進沙裡,告訴User不要上傳中文檔名的檔案找我麻煩。很巧,今天在MSDN Newsgroup上看到MVP小朱提示有個HeaderEncoding屬性

排版顯示純文字
protected void Page_Load(object sender, EventArgs e)
{
    Response.ContentType = "application/octet-stream";
    Response.HeaderEncoding = 
        System.Text.Encoding.GetEncoding("big5");
    Response.AddHeader("content-disposition", 
        "attachment;filename=中文檔名.xls");
    //實際上多會從DB讀取byte[]再BinaryWrite, 示範起見,
    //這裡用WriteFile混過去
    Response.WriteFile(Server.MapPath("中文檔名.xls"));
    Response.End();
}

原來HeaderEncoding是可以設定的,只要設成BIG5,就可以直接在Header中寫入中文字串,很簡單吧?但我測試的結果,HeaderEncoding設成UTF8會導致存檔或開啟都變成CAUZ97JK這種類似Temp的檔案名。那如果檔名有Unicode難字怎麼辦? 我目前打算繼續把頭再埋進沙裡,請User不要故意在檔名取難字煩我,變成問號的話自行負責。

另存與開啟都是中文檔名的感覺,爽!!


Comments

# by

不好意思 我照你的寫法 在自己的專案裡新增一個download.apx 一樣在vb檔裡面加一段同樣的response 但是執行的時候都會出現找不到或無法下載download.aspx 這跟C#或VB有關聯嗎?

# by

我發現Response.AddHeader("content-disposition", "attachment;filename=中文檔名.xls"); 將「中文檔名」四個字改成英文字就正常.... 為什麼我試不出來...

# by 金旺

我要離題了,這Excel的工具列既美觀又實用,是新版的嗎??還是版主開發出來的!!!???!!!!

# by

這是office2007中的Excel

# by

對了 忘了說我的操作環境 使用vista+VS2005+Excel2007 download.aspx及VB檔的編碼我都試過使用 UTF編碼或Big5編碼 都是直接出現download.aspx下載然後無法下載的錯誤

# by Jeffrey

剛才在Vista+IIS7+IE7+Office2007做了測試,結果OK。 "無法下載"的描述有點籠統,可能得提供更明確的錯誤細節(例如: 一字不差的完整錯誤訊息內容等等),大家才容易幫忙推敲。

# by

我不知道怎麼貼圖要不然我就把我的錯誤圖貼上 那我試著再用文字說明看看 就是我們一執行download.apx 時不是應該跳出像文章中第一個圖,就是開啟與儲存的視窗嗎 可是我沒有 他直接變成下載download.apx去了 然而donwload.aspx的下載是不被iis接受的 所以跳出一個視窗寫著 Internet Expoler 無法下載 download.apx 可能是IE無法開啟這個網際網路網站,可能是因為要求的網站無法使用或找不到 請稍候再試 我覺得是我的 Response.AddHeader("content-disposition", "attachment;filename=中文檔名.xls") ~~~~~~~~~ 這一段改成英文的就正常下載與開啟 我是覺得fiename=後面他還是抓不到中文.... 真的很奇怪... 我後來也另外新增專案再試一次... 發現也是一樣 所以想問一下你們的iis、web.config、aspx的內容 有另外設什麼嗎

# by

後來我反覆又反覆地測試....幾乎是瘋了 誰叫我自己是龜毛的處女座 後來...原因是... 我一直用vs2005內建的測試伺服器(就是執行程式才會出現在右下角那個) 結果我把我的程式發行到Windows2000的網站上... 一切都正常了....... 我的天呀....難道是iis版本或是測試伺服器的bug.... 不過...總算讓我解決了....感動中 T_T

# by Jeffrey

(鼓掌~~~~) 你說的沒錯,我測試的結果,的確用VS 2005/VS 2008內建的ASP.NET Development Server執行時,一指定中文下載檔名會出問題,但用IIS跑是OK的。ASP.NET Developermnet Server是一支摸擬IIS作業環境的程式,很有可能在HTTP Header的處理上沒有考慮到HeaderEncoding也說不定。

# by platstar

我試出來了,不過IE6就沒有效,不知有沒有其他方法可以在IE6也能做到呢?

# by Jeffrey

To platstar: 我的測試在IE6與IE7上都是可行的,我猜你的IE6不行可能另有原因。OS與IE6都是中文版? 不行時有得到什麼樣的亂碼或錯誤訊息? 如果你會用Fiddler的話,可以用Fiddler抓到更多有用的線索。

# by platstar

阿...忘了我自己試的環境是用ASP.NET Development Server...難怪不行

# by kevinst

這個在 .Net 1.1 環境 + VS.NET 2003 沒有這功能說 還有其他的辦法嗎

# by Kim

若檔名是 中 文 檔 名.txt 會變 中_文_檔_名.txt

# by Cate

不好意思,我遇到一個相關性的問題,想跟您請教一下 如果要下載的檔案是.txt,會造成txt檔打開後內容有串html的相關資訊,我有在網路上爬文後仍然解不掉,冒昧的向您請教一下是否有解決的方法,我的寫法如下: With Response .Clear() .ClearHeaders() .Expires = 0 .Buffer = True .ContentType = "application/save-as" .AddHeader("content-disposition", "attachment; filename=" & strUser_request) .WriteFile(strFilep) .End() End With

# by Jeffrey

to Cate, 不太確定您所謂"串html相關資訊"的情況為何,不過我建議ContentType改成"application/octet-stream"看會不會有不同的結果。

Post a comment