情况跟这个 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么?   

解决方案 »

  1.   

    貌似没问题,我这里测试完全可以显示正确文件名        Response.AppendHeader("Content-Disposition", string.Format("attachment;filename=\"{0}\"", Server.UrlEncode("中国移动关于调整北京市动感地带话费标准的通知.doc")));
            如果不行你可以设置下Response.HeaderEncoding的值
      

  2.   

    你测试的是doc,你换一下用xls的。用xls的话是不行的
      

  3.   


    一样,没问题,这跟doc与xls没关系吧
      

  4.   

    有关系的,doc和xls的允许的文件名长度最大是不相同的