KB-Open And Download File In Chinese Filename

網友帆問了一個好問題: 他提到用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不要故意在檔名取難字煩我,變成問號的話自行負責。

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

歡迎推文分享:
Published 05 September 2007 01:55 AM 由 Jeffrey
Filed under: , ,
Views: 35,781



意見

#said on 04 September, 2007 10:37 AM

不好意思 我照你的寫法

在自己的專案裡新增一個download.apx

一樣在vb檔裡面加一段同樣的response

但是執行的時候都會出現找不到或無法下載download.aspx

這跟C#或VB有關聯嗎?

#said on 04 September, 2007 10:47 AM

我發現Response.AddHeader("content-disposition",         "attachment;filename=中文檔名.xls");

將「中文檔名」四個字改成英文字就正常....

為什麼我試不出來...

# 金旺 said on 04 September, 2007 06:00 PM

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

#said on 04 September, 2007 07:31 PM

這是office2007中的Excel

#said on 04 September, 2007 08:11 PM

對了 忘了說我的操作環境

使用vista+VS2005+Excel2007

download.aspx及VB檔的編碼我都試過使用

UTF編碼或Big5編碼

都是直接出現download.aspx下載然後無法下載的錯誤

# Jeffrey said on 05 September, 2007 09:04 AM

剛才在Vista+IIS7+IE7+Office2007做了測試,結果OK。

"無法下載"的描述有點籠統,可能得提供更明確的錯誤細節(例如: 一字不差的完整錯誤訊息內容等等),大家才容易幫忙推敲。

#said on 05 September, 2007 10:23 AM

我不知道怎麼貼圖要不然我就把我的錯誤圖貼上

那我試著再用文字說明看看

就是我們一執行download.apx 時不是應該跳出像文章中第一個圖,就是開啟與儲存的視窗嗎

可是我沒有

他直接變成下載download.apx去了

然而donwload.aspx的下載是不被iis接受的

所以跳出一個視窗寫著

Internet Expoler 無法下載 download.apx

可能是IE無法開啟這個網際網路網站,可能是因為要求的網站無法使用或找不到 請稍候再試

我覺得是我的

Response.AddHeader("content-disposition", "attachment;filename=中文檔名.xls")

                                                  ~~~~~~~~~

這一段改成英文的就正常下載與開啟

我是覺得fiename=後面他還是抓不到中文....

真的很奇怪...

我後來也另外新增專案再試一次...

發現也是一樣

所以想問一下你們的iis、web.config、aspx的內容

有另外設什麼嗎

#said on 07 September, 2007 04:33 AM

後來我反覆又反覆地測試....幾乎是瘋了

誰叫我自己是龜毛的處女座

後來...原因是...

我一直用vs2005內建的測試伺服器(就是執行程式才會出現在右下角那個)

結果我把我的程式發行到Windows2000的網站上...

一切都正常了.......

我的天呀....難道是iis版本或是測試伺服器的bug....

不過...總算讓我解決了....感動中 T_T

# Jeffrey said on 07 September, 2007 07:10 PM

(鼓掌~~~~)

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

# platstar said on 13 September, 2007 03:22 AM

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

# Jeffrey said on 13 September, 2007 09:12 AM

To platstar:

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

# platstar said on 25 September, 2007 09:14 PM

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

# kevinst said on 17 October, 2007 07:13 PM

這個在 .Net 1.1 環境 + VS.NET 2003 沒有這功能說

還有其他的辦法嗎

# Kim said on 09 June, 2010 04:20 AM

若檔名是 中 文 檔 名.txt

會變 中_文_檔_名.txt

# Cate said on 25 October, 2010 05:04 AM

不好意思,我遇到一個相關性的問題,想跟您請教一下

如果要下載的檔案是.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

# Jeffrey said on 25 October, 2010 10:49 PM

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

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2007>
SunMonTueWedThuFriSat
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication