关于下载文件时长文件名的问题.如何修改HttpResponseHeaders的编码
情况跟这个 http://topic.csdn.net/t/20060414/19/4687886.html 一样的
以前的一个系统出了一个小问题.
有一个文件下载页面: filedownload.aspx?id=15
通过传入的id来下载文件,基本代码如下:
this.Response.Clear();
int id = this.GetInt32ByQueryStr("fileid");
// 获取文件基本信息包括路径和文件名
UploadFileInfo fileinfo = UploadFileBLL.GetInfoByID(id);
// 得到文件的本地路径
string filepath = Request.MapPath(fileinfo.LocalPath + fileinfo.Name);
// 问题在这里.
Response.AppendHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", Server.UrlPathEncode(fileinfo.Name)));
this.Response.WriteFile(filepath);
this.Response.End();
我通过在HttpHeaders里加"Content attachment;filename=文件名"这种方式来显示文件名.
这样用户打开是就会显示一个包含下载文件名的对话框.保存时也会按这个文件名进行保存.
我使用了UrlPathEncode来进行编码,这样一个中文就被编码成了9个字节,如:"中" 被编码为 "%e4%b8%ad".
返回到客户端的应该是这种样式:
Content-Disposition: attachment;filename="%e4%b8%ad%e5%9b%bd%e7%bd%91%e9%80%9a%e5%85%b3%e4%ba%8e%e8%b0%83%e6%95%b4%e9%83%a8%e5%88%86%e7%94%b5%e4%bf%a1%e4%b8%9a%e5%8a%a1%e8%b5%84.doc"
问题是filename的长度限制是150个byte.见:http://support.microsoft.com/default.aspx?kbid=816868,所以当文件名被编码以后的长度大于150时.文件名被从前面截掉了一部分.
最多只能显示15个汉字再加扩展名(4byte).
可是如果不使用utf-8对文件名进行编码,直接返回gb2312编码的文件名也是可以在客户端正常显示的.
类似于这样:
Content-Disposition: attachment;filename="中国移动关于调整北京市动感地带话费标准的通知.doc"
在客户端上也是可以正常显示的文件下载对话框的.
问题是如何让这句话使用gb2312编码呢??
我只找到了AppendHeader这个方法能修改Header.还有其他方法可以修改Header么?
------解决方案--------------------
貌似没问题,我这里测试完全可以显示正确文件名
Response.AppendHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", Server.UrlEncode("中国移动关于调整北京市动感地带话费标准的通知.doc")));
如果不行你可以设置下Response.HeaderEncoding的值