日期:2014-05-16  浏览次数:20373 次

关于下载文件时长文件名的问题.如何修改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的值