ASP .NET下载具有日文文件名的文件

问题描述:

我目前正在为我的ASP .NET应用程序使用Visual Studio 2008。我试图通过Response对象来服务于一个excel文件。问题是我似乎无法将文件的标题设置为日文。如果我将它设置为日文文件名,它将作为垃圾字符返回。我在日文WinXP中使用日文IE浏览器。ASP .NET下载具有日文文件名的文件

Response.AppendHeader("Content-Type", "application/vnd.ms-excel"); 
Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", "日本語.xls")); 

OR

Response.AddHeader("Content-Disposition", String.Format("attachment; filename=\"{0}\"", Server.HtmlEncode("日本語.xls"))); 

我已经尝试更改编码为Shift-JIS

Response.Charset = "Shift_JIS"; 

Response.Charset = "sjis"; 

任何想法?顺便说一句,我也有与Visual Studio 2005相同的问题。

我不是ASP专家,但您是否尝试过使用UrlEncode重新编码文件名?

Response.AddHeader("Content-Disposition", 
    System.Web.HttpUtility.UrlEncode(String.Format("attachment; filename=\"{0}\"", "日本語.xls"))); 
+0

我不相信这一点。有效。 – Nap 2009-09-16 12:35:07

+0

我看到了java的这个解决方案,以防止在临时文件夹中将打开的文件名设置为unicode编码的名称。 String fileName =“データ出力.txt”; HttpServletResponse response = requestCondition.getResponse(); response.setContentType(“application/plain”); String dFilename = new String(fileName。getBytes(“Windows-31J”),“ISO-8859-1”); response.setHeader(“Content-Disposition”,“attachment; filename =”+ dFilename); response.setCharacterEncoding(“WINDOWS-932”); – Nap 2009-10-09 05:52:48

Response.Charset只涉及HTTP请求的主体。根据the HTTP spec,标题被隐式编码为ISO-8859-1 - 编码之外的字符必须是MIME-encoded

这只是合乎逻辑的 - 毕竟,由Response.Charset设置的正文编码本身在标题中指定。

我得到它的工作,终于... :)

System.Web.HttpUtility.UrlPathEncode使用解决垃圾问题,但是当你打开文件,它显示在文件名,而不是实际的日文字符Unicode的未编码的名字。(好,这是IE7和IE6中的问题,UrlPathEncode可以与IE8一起正常工作。)

因此,您不应使用System.Web.HttpUtility.UrlPathEncode,而应使用用于Response标头的编码来解码filname。

在.NET中,默认情况下,响应头的编码是utf-8,将其更改为iso-8859-1。 修改web.config为相同,如下图所示,

<globalization responseHeaderEncoding="iso-8859-1" .../> 

和代码会是这样,

//apply Response header's encoding i.e. iso-8859-1 to the filename. 
    Dim fileName as String = "在庫あり全商品を24時間以内に出荷.doc" 
    Dim enc As Encoding = Encoding.GetEncoding("shift_jis") 
    Dim dec As Encoding = Encoding.GetEncoding("iso-8859-1") 
    fileName = dec.GetString(enc.GetBytes(fileName)) 

    //Show Download Dialog box and Writting it on Client Side. 
    Response.ClearHeaders() 
    Response.ContentType = corspBean.ContentType 
    Response.AppendHeader("content-disposition", "attachment; filename=""" + fileName + """") 
    Response.BinaryWrite(bytes) 
    Response.End() 

现在,一个更重要的事情,我已经浪费了很多,因为它的时间,是这不适用于ASP.NET开发服务器即用于测试/调试本地计算机上的Web应用程序的服务器。因此,将解决方案部署在IIS上并从那里进行测试。它在IIS上工作得很好。 (并且IIS是每个ASP.NET应用程序的命运;)因此它是否在ASP.NET开发服务器上工作并不重要)