中文名字文件下载问题

stickking 2006-11-05 12:59:31
做下载程序时碰到一个问题:
文件名称为汉字,如:“大家好0001.pdf”
header中添加"attachment;filename="处如果对文件名使用System.Web.HttpUtility.UrlEncode进行编码,直接使用IE下载则文件名显示正常,而用Flashget, Netants,IDM等下载工具下载就是乱码,而且不同的工具
乱码显示也不一样,但使用迅雷却正常;如果编码使用Server.URLEncode对文件名进行编码,则情况刚好相反:IE下载时乱码,而使用netants正常但Flash还是乱码。奇怪的是这两种情况下迅雷都正常(Flash都不正常)。
出现这种情况跟服务器端编码肯定有关系,但是就是不知道问题处在什么地方,又或者不同客户端也是产生这个问题的原因?
您如果碰到过这种问题或者您对汉字编码方面有所研究,望不吝赐教,谢谢!

翻遍了老帖子,相关的问题很多,但没有相同的问题!
...全文
461 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
李煎熬 2006-11-06
  • 打赏
  • 举报
回复
一般我用UrlEncode,根据URL的规范,这是绝对正确的做法,有些软件不支持此规范是它们的问题。

===============================

呵呵,我猜你写程序肯定是经验丰富,不过别太局限在单纯地写程序上。
hchxxzx 2006-11-05
  • 打赏
  • 举报
回复
用这个试试

/// <summary>
/// 输出硬盘文件,提供下载
/// </summary>
/// <param name="myFileName">要输出的文件名</param>
/// <param name="myFullPath">要输出的文件全路径,带文件名</param>
/// <param name="mySpeed">要输出的速度,单位:字节</param>
/// <returns>返回是否成功</returns>
public bool DownLoadFile(string myFileName,string myFullPath,string strContentType,int mySpeed)
{
try
{
FileStream myFile = new FileStream(myFullPath,FileMode.Open,FileAccess.Read,FileShare.ReadWrite);
BinaryReader br = new BinaryReader(myFile);

try
{
//输出字节
this.Response.AddHeader("Accept-Ranges","bytes");
//非缓冲输出
this.Response.Buffer = false;

//字义长度
long FileLength = myFile.Length;
long StartBytes = 0;
int pack = 1024;

//设定堵塞时间的长度
int sleep = (int)Math.Floor(1000 * pack / mySpeed) + 1;

if (this.Request.Headers["Range"] != null)
{
this.Response.StatusCode = 206;
string[] range = this.Request.Headers["Range"].Split(new char[] {'=', '-'});
StartBytes = Convert.ToInt64(range[1]);
}

//定义输出长度
this.Response.AddHeader("Content-Length", (FileLength - StartBytes).ToString());

//如果不是从第0字节开始输出
if (StartBytes != 0)
{
this.Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", StartBytes, FileLength - 1, FileLength));
}

//设定输出方式
this.Response.AddHeader("Connection", "Keep-Alive");

//根据有无传递输出类型,默认输出下载文件
if(strContentType == "")
{
this.Response.ContentType = "application/octet-stream";
}
else
{
this.Response.ContentType = strContentType;
}

//输出文件
//this.Response.AddHeader("Content-Disposition","attachment;filename=" + HttpUtility.UrlEncode(myFileName,System.Text.Encoding.UTF8) );
this.Response.AddHeader("Content-Disposition","online;filename=" + HttpUtility.UrlEncode(myFileName,System.Text.Encoding.UTF8) );

br.BaseStream.Seek(StartBytes, SeekOrigin.Begin);
int maxCount = (int) Math.Floor((FileLength - StartBytes) / pack) + 1;

for (int i = 0; i < maxCount; i++)
{
if (System.Web.HttpContext.Current.Response.IsClientConnected)
{
this.Response.BinaryWrite(br.ReadBytes(pack));
Thread.Sleep(sleep);
}
else
{
i=maxCount;
}
}

return(true);
}
catch
{
return(false);
}
finally
{
br.Close();
myFile.Close();
}
}
catch(Exception ex)
{
this.MyDebug(ex.Message);
return(false);
}
}
cat_hsfz 2006-11-05
  • 打赏
  • 举报
回复
一般我用UrlEncode,根据URL的规范,这是绝对正确的做法,有些软件不支持此规范是它们的问题。
blackant2 2006-11-05
  • 打赏
  • 举报
回复
可能你并没有试过
我没有安装netants和迅雷
但flashget和ie/firefox中都是正常的中文名
示例代码如下

<%@ Page Language="C#" %>
<script runat="server">
void Page_Load(object sender, EventArgs e) {
Response.Clear();
Response.HeaderEncoding = Encoding.GetEncoding("gb2312");
Response.AppendHeader("Content-type", "applicateion/octet-stream");
Response.AppendHeader("Content-Disposition", "attachment; filename=汉字名称");
Response.AppendHeader("Content-Length", "175838");
Response.WriteFile("maipao.rar");
}
</script>

stickking 2006-11-05
  • 打赏
  • 举报
回复
早就试过了,这样都是乱码,无论是ie下载还是工具下载
blackant2 2006-11-05
  • 打赏
  • 举报
回复
Response.HeaderEncoding = Encoding.GetEncoding("gb2312");
Response.AppendHeader("Content-Disposition", "attachment; filename=汉字名称");

62,025

社区成员

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

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

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

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