javaEE杂项 --下载文件乱码的不同解决方案

在下载文件时,常见的方法:

  1. public void getuseopdoc(HttpServletResponse response) throws Exception {
  2. try {
  3. String filename = "某某文件";
  4. InputStream inputStream = getClass().getResourceAsStream("/doc/"+filename+".doc");
  5. response.reset();
  6. response.setCharacterEncoding("utf-8");
  7. response.setContentType("application/x-msdownload");
  8. response.setHeader("Content-Disposition","attachment; filename="+filename+".doc");
  9. IOUtils.copy(inputStream, response.getOutputStream());
  10. response.flushBuffer();
  11. inputStream.close();
  12. } catch (Exception e){
  13. log.debug("Request could not be completed at this moment. Please try again.");
  14. e.printStackTrace();
  15. }
  16. }
  • 客户端得到的几乎都会是乱码, 因为filename是UTF8编码,它被设置为attachment属性值,然后通过HTTP传输到请求端浏览器,但是,HTTP的传输编码是ISO 8859-1(java的网络传输标准编码). 用ISO8859-1传输utf8字符串肯定不兼容导致乱码或者某些错误字符.
  • 所以这时候我们想到把utf8字符串转换成iso8859-1的编码方法,传输到客户端后再用UTF8解码:
  1. public void getuseopdoc(HttpServletResponse response) throws Exception {
  2. try {
  3. String filename = "重庆水库大坝安全监测信息管理平台操作手册(业务版)";
  4. InputStream inputStream = getClass().getResourceAsStream("/doc/"+filename+".doc");
  5. response.reset();
  6. response.setCharacterEncoding("utf-8");
  7. response.setContentType("application/x-msdownload");
  8. response.setHeader("Content-Disposition","attachment; filename="+new String(filename.getbytes("utf-8"),"iso8859-1")+".doc");
  9. IOUtils.copy(inputStream, response.getOutputStream());
  10. response.flushBuffer();
  11. inputStream.close();
  12. } catch (Exception e){
  13. log.debug("Request could not be completed at this moment. Please try again.");
  14. e.printStackTrace();
  15. }
  16. }

字符编码的更多信息可以查看http://blog.csdn.net/robertcpp/article/details/7837712.

utf8是Unicode编码的一种优化版,因为unicode对所有字符都编码为2个字节,这导致了标准unicode编码不和任何其他编码兼容. utf-8在Unicode基础上做了一定的修改,对属于ascii的字符依然采用1个字节编码,而其他的字符则采用更多的字节. 这也被称为变长字节编码. utf8这样处理就使得它与iso8859-1兼容了. 然后说说gb2312/gbk. 二者差别在于后者可以表示繁体字,可以看作前者超集. gb2312是中文编码的国标,对所有中文采用2字节编码,相对utf-8来说,他可能还更加的节省空间.

笔者在测试上面代码的时候,IE下文件名依然乱码, 原因未知. 不过我在把转换的编码从utf-8改为gb2312后就好了.

  • 在求助google后,找到下面这段代码(依赖了spring的包):

    1. protected String getFileName(String filename) {
    2. try{
    3. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    4. if (request.getHeader("User-Agent").indexOf("MSIE") != -1) {
    5. return ‘\"‘ + java.net.URLEncoder.encode(filename, "UTF-8") + ‘\"‘;
    6. }
    7. byte[] bytes = filename.getBytes("UTF-8");
    8. StringBuilder buff = new StringBuilder(bytes.length << 2);
    9. buff.append("=?UTF-8?Q?");
    10. for (byte b : bytes) {
    11. int unsignedByte = b & 0xFF;
    12. buff.append(‘=‘).append(HEX_CHARS[unsignedByte >> 4]).append(HEX_CHARS[unsignedByte & 0xF]);
    13. }
    14. return buff.append("?=").toString();
    15. }catch(UnsupportedEncodingException e){
    16. return filename;
    17. }
    18. }

    这段代码对文件名并区分ie和其他浏览器,然后设置不同的编码格式.

    测试在不同的环境下都可以用

null

时间: 2025-01-18 00:37:43

javaEE杂项 --下载文件乱码的不同解决方案的相关文章

Amazon 解决下载文件乱码

Amazon 解决下载文件乱码 大家在做多个站点的时候,可能会遇到下载下来的报告文件出现乱码. 法国站点和意大利站点均会出现这样的情况,那怎么解决呢? 这是由于编码的问题而导致,在我们读取数据插入到本地数据库的时候,不妨先将格式转成对应国家能正确识别的格式. 在文档中也有看到. 还要一个问题需要说明,由于操作系统设置默认语言的原因,在小国家站点,我们下载下来的报告可能会出现乱码的情况.这种情况很正常,在调用接口的时候,也没有办法去解决直接下载就出现正常编码. 现在的方法是将下载下来的乱码文件,通

下载文件乱码问题

1.下载文件乱码问题     new String("免责声明.pdf".getBytes("utf-8"), "ISO-8859-1"): 2.图片转blog String path = request.getSession().getServletContext().getRealPath("/");                String a = picturename2.replace(              

解决各大浏览器下载文件乱码以及Firefox下载文件名不全问题

最近做项目,采用Spring MVC做控制层,下载文件的文件名总是在主流浏览器上显示乱码,Firfox不是乱码了,IE下又成了乱码.也是烦,IE总是独树一帜,没办法,只能让程序去适应,在网上也搜索了很多,但是解决的不理想,主要是IE11作为主流浏览器后,很多人之前提出的方案都失效了. 简单来说,之前使用request获取header中的user-agent,通过MSIE关键字来判断是否是IE浏览器,如果是IE浏览器,使用utf-8对文件名编码就可以了.然而,IE11的user-agent已经没有

ServletResponse下载文件乱码

借助于强大的搜索引擎和本地试验. 通常来说解决乱码两个方式: 1.把文件名(包括汉字)编码成UTF-8 String downloadOrigalFile = "测试文件乱码.xlsx"; String downloadFileName = java.net.URLEncoder.encode(downloadOrigalFile, "UTF-8"); response.setHeader("Content-Disposition", "

springboot ResponseEntity&lt;byte[]&gt; 下载文件乱码

spring3以后添加httpMessageConverter消怎机制.其中可以通过org.springframework.http.ResponseEntity<byte[]>对象下载文件. pom文件如下: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocat

Microsoft Edge浏览器下载文件乱码修复方法

随着Windows10的普及,Microsoft Edge自带浏览器使用频率逐渐提升,在日常使用过程中我们会发现一个常规的问题是使用Edge进行日常文件下载的时候,N多情况下可能都是乱码,同样的下载链接在Chrome\Firefox\IE等等都是没有问题的,这就很尴尬了,今天简单介绍下处理方法,具体如下: 乱码问题: 处理方法: 1.热键Win + R打开运行栏,输入gpedit.msc打开组策略编辑器: 2.在本地组策略编辑器中定位 计算机配置--管理模板--Windows组件--Intern

firefox下载文件的名称乱码问题

firefox下载文件乱码 一看题目,说的是什么鬼.且听我细细到来. 从firefox浏览器上下载了一个文件,文件名是乱码,如下: %E9%9D%9E%E5%85%A8%E8%AE%BA%E6%96%87%E8%AF%B4%E6%98%8E%E4%BC%9A.pptx 虽然我知道下载的这个文件名叫什么,但是光重命名,对不起这个程序员的称谓. 于是乎开始了看不懂字符串的编码到看得懂的字符串的转换. 为什么会乱码 因为不同的浏览器遵守不同的标准和协议 例如,发送一个文件时,需要在HTTP heade

[转]JSP或servlet中(以及上传下载文件)中文乱码或不显示的解决方案

时间 2014-04-14 14:33:44  CSDN博客 原文  http://blog.csdn.net/xby1993/article/details/23677375 主题 ServletJSP JSP或servlet中中文乱码的解决方案: 1.以POST请求方式: 在获取请求参数之前设置: request.setCharacterEncoding("utf-8"); 设置输出编码: response.setContentType("text/html;charse

HttpWebRequest下载文件,乱码问题解决方案

写在前面 今天之所以会总结HttpWebRequest下载文件,主要是因为在使用该类下载文件的时候,有些地方需要注意一下,在实际的项目中遇到过这种问题,觉得还是有必要总结一下的.在下载文件时,最常见的就是下载的文件出现乱码. 一个例子 还是以前面介绍的restful接口为例吧,现在我要通过HttpWebRequest请求,来下载图片,可以这样来. api地址为:http://localhost:21074/ImageService/api/1.jpg 关于restful imageservice