日期:2014-05-18  浏览次数:20919 次

直接打开中文文件名的附件,ASP 可以实现,但 ASP.NET 怎么也实现不了
网页输出文件,为中文文件名,网上有很多人问过,好像也都有了结果,用 UTF8 编码文件名输出就可以了。但如果是在浏览器中直接点打开,会发现打开的文件名是编码后的文件名,好像这样 %e7%94.doc 。

如果用 ASP 可以做到直接打开,显示的名字就是正常的汉字,实现的很好。

经过用 CommView 分析,ASP 输出结果:attachment;filename="单阀.doc" 是直接输出。 汉字的二进制部分:B5 A5 B7 A7
ASPX 输出结果:attachment;filename="鍗曢.doc"。汉字的二进制部分:E5 8D 95 E9

现在问题是,怎样能让它输出 ASP 那样的输出结果?也就是在 
Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + s + "\"") 中,能原封不动的把 s 变量的中文数据输出出来?

尝试用 ResponseEncoding 来解决,但不知道设置什么 Encoding。

顺便提一下,gmail 的附件,如果是中文文件名,也会遇到这个问题。








------解决方案--------------------
1: 对fileName进行URL编码, 把下划线标注的那句改为
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + Server.UrlEncode(fileName) + "\"");
便可.
2: 假设当前的URL为 http://localhost/download.aspx?id=123, fileName为"下载.pdf", 我们只要把下载URL改为 http://localhost/download.aspx/下载.pdf?id=123 可, 上面下划线标注的那句代码则可以注释掉了
------解决方案--------------------
可不可以先对你的参数进行URL编码?然后在你要打开取路径的时候解码的话应该可以变为正常汉字的
------解决方案--------------------
原理其实很简单,就是修改一下HTTP的响应头信息就可以了。

 

因为我原来设计的时候就把附件的处理做成一个用户组件,所以修改起来也很简单,只要增加一个下载的界面及修改用户组件的内容即可。

具体步骤:

1、把原来显示附件的链接地址统一改为AttachDownload.aspx?attachid=xxxx

2、添加一个AttachDownload.aspx页面,具体的代码如下:

  

Code
 1 private void Page_Load(object sender, System.EventArgs e)
 2 {
 3 int iAttachID = 0;
 4 try
 5 {
 6 iAttachID = Convert.ToInt32(this.Request["ATTACHID"].ToString());
 7 }
 8 catch(Exception ex)
 9 {
10 Response.Write("参数传递错误!"+ex.Message);
11 Response.End();
12 }
13 
14 DataTable dt = EOffice.DataAccess.SystemManage.BLOB.Query_BLOB(iAttachID,"",ref this.Exc,Global.Conn);
15
16 if(dt.Rows.Count==1)
17 {
18
19 string Title = dt.Rows[0]["BLB_FILENAME"].ToString();//"中文的名称.doc";//这里是欲显示在另存为里面的文件名字,必须有后缀名
20 string fileName = Global.AttachPath + "" + dt.Rows[0]["BLB_URL"].ToString();//"d:\test.doc";//这里是实际存在的文件路径
21
22 Response.Charset = "UTF-8";
23 Response.ContentEncoding = System.Text.Encoding.UTF8;
24 Response.Buffer = false;
25 Response.Clear();
26 Response.ContentType = "APPLICATION/OCTET-STREAM;charset=UTF-8";//dt.Rows[0]["BLB_MIMETYPE"].ToString();//"APPLICATION/OCTET-STREAM";
27 Response.AddHeader("Content-Disposition", "attachment;filename=\"" + Server.UrlEncode(Title) +"\"");
28 try
29 {
30 //Response.AddHeader("Content-Length", file.Length.ToString());
31 Response.WriteFile(Server.MapPath(fileName));
32 Response.Flush();
33 Response.Clear();
34 Response.End(); 
35 }
36 catch(Exception ex)
37 {
38 Response.ContentType = "text/html; charset=gb2312";
39 Response.Write("<script>alert('下载文件错误:"+ex.Message+"');</