.net C# 下,下载时文件名为中文太长时就出现乱码和被截现象,我看过好多帖子试过好多方法都不行,大家探讨下,找个好的解决方案,做成功过的大虾给点提示,分享下经验哈            Response.Buffer = true;
            Response.Clear();
            Response.ContentType = ct;///"application/octet-stream"; 
            int i = filename.LastIndexOf(".");
            string ext = "";
            if (i > 0)
            {
                ext = filename.Substring(i);
                filename = filename.Substring(0, i);
            };
            filename = HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8);
            filename = filename + ext;
            Response.AddHeader("Content-Disposition", "inline;attachment;filename=\"" + filename + "\"");
            Byte[] b = (Byte[])reader["EFile"];
            if (b.Length == 0)
            {
                Byte[] b2 = { Byte.Parse("32") };
                Response.BinaryWrite(b2);
            }
            else
            {
                Response.BinaryWrite(b);
            }
            Response.Flush();
            Response.End();

解决方案 »

  1.   

    新建的web技术交流群,欢迎大家加入一起讨论:
    群号:29037453
      

  2.   

    string   strFileName   =   System.Web.HttpUtility.UrlEncode(   
      System.Text.Encoding.UTF8.GetBytes("带中文的url"));   
        
      Response.AppendHeader("Content-Disposition",   "attachment;   filename="   +   strFileName); 
      

  3.   


    敢问下要怎么设呢?麻烦详细点,Thanks !!
      

  4.   

    使用分块下载。string fileName = "aaa.txt";
            string filePath = @"D:\新实打实的撒旦撒旦文档倒萨按到阿萨德倒萨.txt";        System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);        if (fileInfo.Exists == true)
            {
                const long ChunkSize = 102400;
                byte[] buffer = new byte[ChunkSize];            Response.Clear();
                System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);
                long dataLengthToRead = iStream.Length;
                Response.ContentType = "application/octet-stream";
                Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
                while (dataLengthToRead > 0 && Response.IsClientConnected)
                {
                    int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));
                    Response.OutputStream.Write(buffer, 0, lengthRead);
                    Response.Flush();
                    dataLengthToRead = dataLengthToRead - lengthRead;
                }
                Response.Close();
            }
      

  5.   


    群号:29037453 .
    net技术交流群,欢迎喜欢.net开发的同仁们一起讨论问题,解决问题,交流经验和技术
      

  6.   


    我试了,当filename = "中文收文引入正文不限制格式当文件查看时按照一般附件可以打开或下载回退时将回退节点上级节点后面所有节点的即时消息状态改为.doc" 时,点下载文件名就变成“%8a%82点后面所有节点的即时消息状态改为.doc” 了期待中。。
      

  7.   

    我顶。OMG 楼上真悲剧。问题还么解决。等着请客吃饭吧。。哈哈哈哈
      

  8.   

    UrlPathEncode  试了,问题依旧,happy664618843 能不能详细说下具体怎么设SetRequestHeater ?  谢谢
      

  9.   

    这是由于内容部署标头用于文件流是大于大约 150 字节, 拉丁字符集是等于 150 个字符。 如果是使用非拉丁字符集, 例如日语或俄语格式化内容部署标头可能会发生此行为。
    if (fullFileName.Length > 150) 

    byte[] bs = System.Text.Encoding.UTF8.GetBytes(fullFileName); 
    fullFileName = System.Text.Encoding.Default.GetString(bs); } 下载在IE8里面是完全正常的,在IE6里面就会造成字符串截止
    不使用UTF8的UrlEncode编码,直接使用gb2312编码输出中文名。
    HttpResponse.TransmitFile
      

  10.   


    最后的几句什么意思啊? HttpResponse.TransmitFile 是?
      

  11.   

    HttpResponse.TransmitFile 下载文件
      

  12.   

    if (fullFileName.Length > 150) 

    byte[] bs = System.Text.Encoding.UTF8.GetBytes(fullFileName); 
    fullFileName = System.Text.Encoding.Default.GetString(bs); } 
      

  13.   


    我在研究,貌似有戏wuxing2006 能不能给多一点点的提示?比如说代码之类的都行哈
      

  14.   

    总结下:HttpResponse.TransmitFile ,IE6下被截短了,IE7乱码并且被截短了,IE8下OK,FF下OK,并且此方法只适合把存在服务器上的文件下载,不能从数据库下载,与需求有差别,舍之继续期待高手
      

  15.   

    不知道换个思路是否可以文件可以直接给出路径 ,在这里同时判断此处是否可见 <a href="绑定路径"></a>LZ这样下载,应该是前面的代码还有权限判断吧?可以在HTML处直接判断权限,然后控制是否显示也是个方法。
      

  16.   


    你的 <a href="绑定路径"></a>  里路径去哪呢?一个页面?然后让那个页面负责下载?还是直接href到那个文件?估计这样行不通
      

  17.   

    who can help me? 一个附件折腾我好久啦!
    谁帮我解惑
      

  18.   

     Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");