下载文件 文件名 乱码的问题.

之前看到博友们一些文章解决asp.net的下载文件名的乱码,但是貌似针对其他浏览器比如Firefox的中文还是有乱码,空格出现+号(这时候IE,Chrome没问题)

刚才试了试,用这个方法可以搞定了IE,Chrome,Firefox.其他没测试,先贴上代码:

 

 

 

复制代码
代码
public class UrlEncoder 
    { 
        
/// <summary> 
        
/// Encodes non-US-ASCII characters in a string. 
        
/// </summary> 
        
/// <param name="s"></param> 
        
/// <returns></returns> 
        public static string ToHexString(string s) 
        { 
            
char[] chars = s.ToCharArray(); 
            StringBuilder builder 
= new StringBuilder(); 
            
for (int index = 0; index < chars.Length; index++
            { 
                
bool needToEncode = NeedToEncode(chars[index]); 
                
if (needToEncode) 
                { 
                    
string encodedString = ToHexString(chars[index]); 
                    builder.Append(encodedString); 
                } 
                
else 
                { 
                    builder.Append(chars[index]); 
                } 
            } 
            
return builder.ToString(); 
        } 
        
/// <summary> 
        
/// Determines if the character needs to be encoded. 
        
/// </summary> 
        
/// <param name="chr"></param> 
        
/// <returns></returns> 
        private static bool NeedToEncode(char chr) 
        { 
            
string reservedChars = "$-_.+!*'(),@=&"
            
if (chr > 127
                
return true
            
if (char.IsLetterOrDigit(chr) || reservedChars.IndexOf(chr) >= 0
                
return false
            
return true
        } 
        
/// <summary> 
        
/// Encodes a non-US-ASCII character. 
        
/// </summary> 
        
/// <param name="chr"></param> 
        
/// <returns></returns> 
        private static string ToHexString(char chr) 
        { 
            UTF8Encoding utf8 
= new UTF8Encoding(); 
            
byte[] encodedBytes = utf8.GetBytes(chr.ToString()); 
            StringBuilder builder 
= new StringBuilder(); 
            
for (int index = 0; index < encodedBytes.Length; index++
            { 
                builder.AppendFormat(
"%{0}", Convert.ToString(encodedBytes[index], 16)); 
            } 
            
return builder.ToString(); 
        } 
    }
复制代码

 

 

 

然后在下载下面中:

 

 

 

复制代码
代码
response.ContentType = "application/octet-stream"
response.HeaderEncoding 
= Encoding.UTF8; 
string encodefileName = UrlEncoder.ToHexString(fileName); 
string userAgent = request.UserAgent.ToUpper(); 
string fileNameHead = null;
if (userAgent.IndexOf("FIREFOX"> 0
    fileNameHead 
= string.Format("attachment;filename*=utf8''{0}", encodefileName); 
else 
    fileNameHead 
= string.Format("attachment;filename={0}", encodefileName);
response.AddHeader(
"Content-Disposition", fileNameHead); 
复制代码

 

 

就成了.

posted @   Sai~  阅读(1875)  评论(2编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示