关于下载文件乱码的问题

hebaobao19880921 2011-08-02 09:56:03

//获取资源的编号
string id = Request["id"].ToString();
NRBLL.File bf = new Asiastar.NRBLL.File();
Guid guid = new Guid(id);
//获取资源完整路径
string filepath = bf.FN_SerchPathByFileId(guid).Tables[0].Rows[0]["FilePath"].ToString();
//文件名称
string filename = bf.FN_SerchPathByFileId(guid).Tables[0].Rows[0]["FileNam"].ToString();
filepath = Server.UrlDecode(filepath);
filename = Server.UrlDecode(filename);
//FileInfo fileinfo = new FileInfo(filepath);
////string filename = System.IO.Path.GetFileName(fileinfo.FullName);
try
{
//string fileName = HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(filename));
//filename = filename.Replace("+", "%20"); //将“+”替换成“空格”
// 以字符流的形式下载文件
FileStream fs = new FileStream(filepath, FileMode.Open);
byte[] bytes = new byte[(int)fs.Length];
fs.Read(bytes, 0, bytes.Length);
fs.Close();
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = Encoding.GetEncoding("gb2312");
Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(filename, System.Text.Encoding.UTF8));
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
}
catch (Exception exe)
{
Response.Write(exe.ToString());
}

保存是正常的 但是直接IE打开文件名称就是乱码了
...全文
708 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
研小艾 2012-02-03
  • 打赏
  • 举报
回复
... 无意间看到的 就解决了吧..
Response.AddHeader("Content-Disposition", "attachment;filename="+Uri.EscapeDataString( FileName));
hebaobao19880921 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ynsky 的回复:]
ASP.NET 解决下载文件名乱码问题
string fileName="中文.xls";

string filePath = @"/UpLoad/Reports"

FileInfo file = new FileInfo(System.Web.HttpContext.Current.Server.MapPath(filePath)+fileName);

Response……
[/Quote]
是浏览器的问题.IE7 -IE8
YnSky 2011-08-02
  • 打赏
  • 举报
回复
ASP.NET 解决下载文件名乱码问题
string fileName="中文.xls";

string filePath = @"/UpLoad/Reports"

FileInfo file = new FileInfo(System.Web.HttpContext.Current.Server.MapPath(filePath)+fileName);

Response.Charset = "utf-8";

Response.ContentEncoding = System.Text.Encoding.UTF8;

// 添加头信息,为"文件下载/另存为"对话框指定默认文件名

Response.AddHeader("Content-Disposition", "attachment; filename=" +HttpUtility.UrlEncode("下载文


件"+".xls",System.Text.Encoding.UTF8));

// 添加头信息,指定文件大小,让浏览器能够显示下载进度

Response.AddHeader("Content-Length", file.Length.ToString());

// 指定返回的是一个不能被客户端读取的流,必须被下载

Response.ContentType = "application/ms-excel";

// 把文件流发送到客户端

Response.WriteFile(file.FullName);

// 停止页面的执行

Response.End();

/////////////可用///////////////////////////////////////////////////////

ASP.NET实现下载功能的中文文件名乱码处理(收集)

在系统中添加文件管理的下载功能, 要求在ASPX文件中实现, 以进行权限的控件,于是添加下列代码:

...

Response.ContentType = mime; //相应的MIME TYPE

Response.AppendHeader("Content-Disposition", "attachment; filename=\"" +fileName + "\"");

Response.BinaryWrite(bytes);

Response.End();

...

当fileName中包含中文时, 文件下载保存时, 文件名变成了乱码, 需要用户修改,

解决办法1:

对fileName进行URL编码, 把下划线标注的那句改为

Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + Server.UrlEncode(fileName) + "\"");

便可.虽然中文乱码问题解决了, 但是还有一个问题: 在测试时, 下载保存的文件名有时会变成该页面的名字(.aspx), 虽然可以把内容下载到


本地, 但是需要更改文件名及类型, 这样会给用户带来很大的困惑.

还有一个办法, 可以很简单的解决以上的两个问题:

解决办法2:

假设当前的URL为 http://localhost/download.aspx?id=123, fileName为"下载.pdf", 我们只要把下载URL改为


http://localhost/download.aspx/下载.pdf?id=123 可, 上面下划线标注的那句代码则可以注释掉了

梦纷飞舞 2011-08-02
  • 打赏
  • 举报
回复
那就换一种撒,那有一尘不变的代码?
hebaobao19880921 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 slife890809 的回复:]
C# code
Response.Clear();
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.ContentType = "applicatio……
[/Quote]
按照我上面的做法是可以的 就是不知道哪里有问题 同事那边同样的代码是可以的
梦纷飞舞 2011-08-02
  • 打赏
  • 举报
回复
Response.Clear();
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "attachment;filename=Report.xls");

string stringExportString = Slife.WebUtility.Utils.GetExportString(this.TableDate);
Response.Output.Write(stringExportString);

Response.End();


你试试我这种的?
梦纷飞舞 2011-08-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 yeness 的回复:]

Response.ContentEncoding = Encoding.GetEncoding("gb2312");
---------
怀疑是gb2312的问题
[/Quote]
我也怀疑是这个问题
hebaobao19880921 2011-08-02
  • 打赏
  • 举报
回复
调试的异常是
base {System.SystemException} = {由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。}
xuan.ye 2011-08-02
  • 打赏
  • 举报
回复
Response.ContentEncoding = Encoding.GetEncoding("gb2312");
---------
怀疑是gb2312的问题

62,046

社区成员

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

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

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

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