• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > .net从服务器下载文件中文名乱码解决方案

.net从服务器下载文件中文名乱码解决方案

作者:.net包子 字体:[增加 减小] 来源:互联网 时间:2017-05-28

.net包子 通过本文主要向大家介绍了fkcraft.net服务器,pvp.net服务器断开,mc.hypixel.net服务器,pvp.net聊天服务器,.net服务器等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

从服务器下载文件中文名乱码解决方案,具体文字说明不多了,直接贴代码了,具体代码如下:

try
    {
      string excelName = Request["excelName"].ToString(); //文件路径
      string fileName = Request["fileName"].ToString(); //下载的文件名
      if(!(string.IsNullOrEmpty(excelName)|| string.IsNullOrEmpty(fileName)))
      {
        Response.Charset = "GB2312";
        Response.ContentEncoding = Encoding.GetEncoding("GB2312");
        Response.ContentType="application/vnd.ms-excel";
        //火狐浏览器不需将中文文件名进行编码格式转换
        if (Request.ServerVariables["http_user_agent"].ToLower().IndexOf("firefox") == -1)
        {
          excelName = HttpUtility.UrlEncode(excelName, System.Text.Encoding.UTF8);
        }
        Response.AppendHeader("Content-Disposition", "attachment;filename=" +excelName);
        Response.WriteFile(fileName);
        Response.Flush();
        Response.Close();
      }
    }
    catch
    { }
</div>

 注意判断浏览器 IE需要将中文文件名编码格式转换,而firefox浏览器则不用,不然下载下来的中文文件名会乱码

 response.setHeader()下载中文文件名乱码问题

 首先展示我的解决问题的代码:

 response.setHeader("Content-Disposition", 
 "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8"));  
</div>

 1. HTTP消息头 

 (1)通用信息头

 即能用于请求消息中,也能用于响应信息中,但与被传输的实体内容没有关系的信息头,如Data,Pragma

 主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade 

 (2)请求头 

 用于在请求消息中向服务器传递附加信息,主要包括客户机可以接受的数据类型,压缩方法,语言,以及客户计算机上保留的信息和发出该请求的超链接源地址等.

主要: Accept , Accept-Encoding , Accept-Language , Host , 

 (3)响应头 

 用于在响应消息中向客户端传递附加信息,包括服务程序的名称,要求客户端进行认证的方式,请求的资源已移动到新地址等. 

 主要: Location , Server , WWW-Authenticate(认证头) 

 (4)实体头

 用做实体内容的元信息,描述了实体内容的属性,包括实体信息的类型,长度,压缩方法,最后一次修改的时间和数据的有效期等. 

 主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type

 (4)扩展头 

 主要:Refresh, Content-Disposition

 2. 几个主要头的作用

 (1)Content-Type的作用 

 该实体头的作用是让服务器告诉浏览器它发送的数据属于什么文件类型。 

例如:当Content-Type 的值设置为text/html和text/plain时,前者会让浏览器把接收到的实体内容以HTML格式解析,后者会让浏览器以普通文本解析. 

 (2)Content-Disposition 的作用  

当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。  

 在讲解这个内容时,张老师同时讲出了解决中文文件名乱码的解决方法,平常想的是使用getBytes() , 实际上应使用email的附件名编码方法对文件名进行编码,但IE不支持这种作法(其它浏览器支持) , 使用javax.mail.internet.*包的MimeUtility.encodeWord("中文.txt")的方法进行编码。 

 Content-Disposition扩展头的例子:

 <%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %> 
 <%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date()) 

%> 
<%         
response.setHeader("Content-Type","video/x-msvideo");  
response.setHeader("Content-Disposition", "attachment;filename=aaa.doc"); 
%> 
</div>

Content-Disposition中指定的类型是文件的扩展名,并且弹出的下载对话框中的文件类型图片是按照文件的扩展名显示的,点保存后,文件以filename的值命名,保存类型以Content中设置的为准。

注意:在设置Content-Disposition头字段之前,一定要设置Content-Type头字段。

(3)Authorization头的作用  Authorization的作用是当客户端访问受口令保护时,服务器端会发送401状态码和WWW-Authenticate响应头,要求客户机使用Authorization来应答。

例如:

<%@ page pageEncoding="GBK" contentType="text/html;charset=utf-8" import="java.util.*,java.text.*" %>  
<%=DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT, Locale.CHINA).format(new Date()) 
%> 
<%  response.setStatus(401); 
response.setHeader("WWW-Authenticate", "Basic realm=\"Tomcat Manager Application\""); 
%> 
</div>

3.如何实现文件下载  要实现文件下载,我们只需要设置两个特殊的相应头,它们是什么头?如果文件名带中文,该如何解决? 

两个特殊的相应头:

----Content-Type:    
application/octet-stream ----Content-Disposition: attachment;filename=aaa.zip 
</div>

例如: 

response.setContentType("image/jpeg");response.setHeader("Content- Disposition","attachment;filename=Bluehills.jpg"); 
</div>

如果文件中filename参数中有中文,则就会出现乱码。

解决办法: 

(1)MimeUtility.encodeWord("中文.txt");//现在版本的IE还不行

(2)new String("中文".getBytes("GB2312"),"ISO8859- 1");//实际上这个是错误的

4. 测试并分析文件名乱码问题 

response.setHeader()下载中文文件名乱码问题

response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode(fileName, "UTF-8")); 
</div>

下载的程序里有了上面一句,一般在IE6的下载提示框上将正确显示文件的名字,无论是简体中文,还是日文。
不过当时确实没有仔细测试文件名为很长的中文文件名的情况。现如今经过仔细测试,发现文字只要超过17个字,就不能下载了。

分析如下: 

一. 通过原来的方式,也就是先用URLEncoder编码,当中文文字超过17个时,IE6 无法下载文件。这是IE的bug,参见微软的知识库文章 KB816868 。

原因可能是IE在处理 Response Header 的时候,对header的长度限制在150字节左右。而一个汉字编码成UTF-8是9个字节,那么17个字便是153个字节,所以会报错。而且不跟后缀也不对.

二. 解决方案:将文件名编码成ISO8859-1是有效的解决方案,

代码如下:

response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "ISO8859-1" ) ); 
</div>

在确保附件文件名都是简体中文字的情况下,那么这个办法确实是最有效的,不用让客户逐个的升级IE。如果台湾同胞用,把gb2312改成big5就行。但现在的系统通常都加入了 国际化的支持,普遍使用UTF-8。

如果文件名中又有简体中文字,又有繁体中文,还有日文。

那么乱码便产生了。另外,在上Firefox (v1.0-en)下载也是乱码。

三. 参看邮件中的中文附件名的形式,用outlook新建一个带有中文附件的邮件,然后看这个邮件的源代码,找到:

Content-Disposition: attachment;  filename="=?gb2312?B?0MK9qCDOxLG+zsS1tS50eHQ=?="

用这个filename原理上就可以显示中文名附件,但是现在IE并不支持,Firefox是支持的。尝试使用 javamail 的MimeUtility.encode()方法来编码文件名,也就是编码成 =?gb2312?B?xxxxxxxx?= 这样的形式,并从 RFC1522 中找到对应的标准支持。 折中考虑,结合了一、二的方式,

代码片断如下:

String fileName = URLEncoder.encode(atta.getFileName(), "UTF-8");  /* 
* see

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • .net从服务器下载文件中文名乱码解决方案

相关文章

  • 2017-05-28WinForm实现同时让两个窗体有激活效果的特效实例
  • 2017-05-28C#使用foreach语句遍历堆栈(Stack)的方法
  • 2017-05-28浅谈对c# 面向对象的理解
  • 2018-01-06C#--微信小程序-跳一跳辅助工具源码
  • 2017-05-28C#实现将字符串转换成日期格式的方法
  • 2017-05-28C#多线程学习之(六)互斥对象用法实例
  • 2017-05-28C#探秘系列(四)——GetHashCode,ExpandoObject
  • 2017-05-28C#实现统计字数功能的方法
  • 2017-05-28如何使用C#在PDF文件添加图片印章
  • 2017-05-28C#:(变量)字段和局部变量的作用域冲突

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#加密在实际中的应用
    • C#打开php链接传参然后接收返回值的关键代码
    • C#中使用反射获取结构体实例及思路
    • C#实现的最短路径分析
    • C#自定义基于控制台的Timer实例
    • c#读取文件详谈
    • C# 16进制与字符串、字节数组之间的转换
    • 在Unity中实现简单的伪时间同步
    • C#文件目录操作方法汇总
    • C#纹理画刷TextureBrush用法实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有