关于asp.net 下载文件有中文出现乱码的问题

hebaobao19880921 2011-07-22 10:05:47

protected void FN_ResponseFile()
{
string id = Request["id"].ToString();
NRBLL.File bf = new Asiastar.NRBLL.File();
Guid guid = new Guid(id);
System.IO.Stream iStream = null;
byte[] buffer = new Byte[10000];
string path = bf.FN_SerchPathByFileId(guid).Tables["ds"].Rows[0]["FilePath"].ToString();//这是从数据库取的完整路径 .
int length;
long dataToRead;
string filename = System.IO.Path.GetFileName(path);
try
{
if (Request.UserAgent.Contains("MSIE") || Request.UserAgent.Contains("msie"))
{
filename = ToHexString(filename);
}
iStream = new System.IO.FileStream(path, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.Read);
dataToRead = iStream.Length; Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.GetEncoding("GB2312")));
while (dataToRead > 0)
{
if (Response.IsClientConnected)
{
length = iStream.Read(buffer, 0, 10000);
Response.OutputStream.Write(buffer, 0, length);
Response.Flush();
buffer = new Byte[10000];
dataToRead = dataToRead - length;
}
else
{
dataToRead = -1;
}
}
}
catch (Exception ex)
{
Response.Write("文件下载时出现错误!");
}
finally
{
if (iStream != null)
{
iStream.Close();
}
}
}
/// <summary>
/// 为字符串中的非英文字符编码
/// </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>
///指定 一个字符是否应该被编码
/// </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>
/// 为非英文字符串编码
/// </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();
}


在网上找到了这个解决办法 不知道为什么还是乱码- -
...全文
181 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
孟子E章 2011-07-22
  • 打赏
  • 举报
回复
文件名的处理方法

String ExportFileName = "中文文件名";
if (Request.Browser.Browser.IndexOf("MSIE") > -1)
{
ExportFileName = Server.UrlEncode(ExportFileName);
}

Response.AddHeader("Content-Disposition", "attachment; filename=" + ExportFileName );
孟子E章 2011-07-22
  • 打赏
  • 举报
回复
是内容乱还是文件名乱?
asp.net乱码解决方法 1、从IE地址栏中直接输入这个地址,访问没错;   2、做一个静态页,其中包括这个超链接,点击访问也没错;   3、就是把这个链接添加到这个功能块中,点击访问那边接收到的是乱码。   一开始,被这个问题也搞得头大,在google了一把后,总算是把问题给搞清楚了,其实只要这个链接地址不经过任何编码传递是不会有问题的。但就是加到了这个功能块后,再点击,虽然这个时候在IE地址栏里显示的还是"http://www.****.com/user.aspx?id=水天",但真正传递过去的参数"水天"其实已经经过类似于Server.UrlEncode的操作了,当然默认是utf-8编码,正是由于这个原因,如果对方系统不进行相应的解码,直接操作该参数,就产生了以上的错误。   解决方法:   网上有很多解决之道,最常见的莫过于以下几点:   1、在web.config里配制,这个方法确实可行,但我想很多人不想用这种方法来解决,把整个项目的请求和回应都定为gb2312,我觉得不是一个好办法,有点本末倒置了,毕竟这会导致很多其它问题的出现。   2、把要包含该链接的aspx文档,修改其charset属性为gb2312。这个方法到也可以接受,不过对于该文中的问题还不是最好的方法,因为该功能块是可以动态添加到任何页面的,难道要去修改所有的页面?想想还是不太合适。 单个页面解决方案 添加   3、直接用Server.UrlEncode和Server.Decode进行加码和解码操作,这种方法对于发送方和接收方都在一个项目中是可行的,现在的问题是,我们要随意去访问别人的系统,所以只能弃用此方法了。   4、采用HttpUtility.UrlEncode(query, System.Text.Encoding.GetEncoding("GB2312"));对链接中的参数值进行gb2312的编码,这种方法,对方不用进行任何解码操作,直接接收参数则不会出现乱码。   一般提到最多的也就上面4种方法,其它的也跟这些大同小异。仔细分析后,觉得还是第4种方法最适合解决当前问题,把中文参数进行如4中的操作。但又出现另外一个问题,由于这是一个用户可以自由输入链接地址的功能,所以首先要做的就是得先分析这些链接URL,解析出参数,再对这些参数进行4中操作,然后再合拼成原来的URL地址。   幸亏,URL参数解析C#已经有类库的支持,不用再去写那些复杂的正则表达式来匹配了。

62,244

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧