解决浏览器下载与上传文件中问乱码问题

问题:
我们在写后端Servlet程序处理下载与上传问题时
我们知道下载的文件名,可以与本地文件名不同(假如你的浏览器访问的时本地资源)
如果说此时你的文件名是中文的话,还没有经过特殊处理,
此时一般就会出现乱码问题:

程序Servlet代码

public class DownLoad  extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//       1.获取下载的文件名:String downLoadFileName = "高楼.jpg";//我们就将其固定住了;
//       2.读取要下载的内容(通过ServletContext对象调用方法可以读取)ServletContext servletContext = getServletContext();
//       4.还要告诉客户端收到的数据是用来干什么的String mimeType = servletContext.getMimeType("/file/"+downLoadFileName);System.out.println("下载文件类型为:"+mimeType);resp.setContentType(mimeType);//告诉浏览器,下载的文件类型/**    Content-Disposition响应头,表示收到的数据怎   么处理*    attachment 附件的意思,表示用来下载使用*    filename 表示指定下载文件名* */resp.setHeader("Content-Disposition","attachment;fileName="+downLoadFileName);// 5.把下载的内容传给客户端//斜杠被服务器解析为  http://ip:port/工程名  -----  web//获取资源以流的形式返回InputStream is = servletContext.getResourceAsStream("/file/"+downLoadFileName);//获取相应的输出流,因为把本地资源读取,在输出给应一个流,需要一个输出流OutputStream os = resp.getOutputStream();IOUtils.copy(is,os);//因为将本地相应文件读取到输入流中,然后在复制到输出流这一步的内容完全相容所以形象称其为复制}
}

一,IE与谷歌与新版本火狐浏览器

问题:

原因分析:
由于浏览器是国外设计的,在设计的时候只考虑了英文兼容问题,并没有考虑中文.

问题解决:
通过响应头,告诉浏览器,我要你以什么字符集解析我的文件名
将resp.setHeader(…)修改为
(高楼.jpg是图片的文件名,自己随意)

resp.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode("高楼.jpg","UTF-8"));

解决之后:

因为新版本的火狐浏览器兼容问题提升了,所以对于上面的修改,也可以解决火狐的乱码问题;

二,针对旧版本的火狐浏览器

使用BASE64编码

BASE64编码,简单演示:

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;import java.io.IOException;
import java.io.UnsupportedEncodingException;public class BASE64编码 {public static void main(String[] args) throws IOException {/**   编码操作*  */String content="BASE64编码";//创建一个BASE64编码器BASE64Encoder base64Encoder = new BASE64Encoder();//执行编码操作String enStr = base64Encoder.encode(content.getBytes("UTF-8"));System.out.println(enStr);//QkFTRTY057yW56CB/**   解码操作*  */BASE64Decoder base64Decoder = new BASE64Decoder();byte[] bytes = base64Decoder.decodeBuffer(enStr);String enstr = new String(bytes,"UTF-8");System.out.println(enstr);//BASE64编码}
}

BASE64编码解决火狐乱码问题:

BASE64设置内容简单介绍(=?charset?B?xxxxxx?=):

=? ------------------------------ 表示编码内容的开始
charset ------------------------------ 表示字符集
B ------------------------------ 表示BASE64编码
xxxxx ------------------------------ 表示文件名,
?= ------------------------------ 表示编码内容的结束

这时候需要设置浏览器请求头的内容为:

resp.setHeader("Content-Disposition","attachment;fileName==?UTF-8?B?"+new BASE64Encoder().encode("高楼.jpg".getBytes("UTF-8"))+"?=");


但是我们会发现,当我们解决好火狐以后,别的浏览器又出问题了;
因为针对不同的浏览器的解决方案不同

三,使用动态改变

思路:获取浏览器信息,使用if-else语句动态设置,编码集
我们知道,在请求头的地方会有,浏览器的信息,故我们可以获取浏览器信息进而进行判断

代码所示:

 if(req.getHeader("User-Agent").contains("Firefox")){resp.setHeader("Content-Disposition","attachment;fileName==?UTF-8?B?"+new BASE64Encoder().encode("高楼.jpg".getBytes("UTF-8"))+"?=");}else{resp.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode("高楼.jpg","UTF-8"));}

---------------以上内容参照,尚硅谷JavaWep韩振国
完美解决…

解决常用浏览器上传与下载文件中问乱码问题相关推荐

  1. linux securefx 传输文件失败,解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题...

    解惑:如何使用SecureCRT上传和下载文件.SecureFX乱码问题 一.前言 很多时候在windows平台上访问Linux系统的比较好用的工具之一就是SecureCRT了,下面介绍一下这个软件的 ...

  2. Android之解决PC浏览器上传表单文件到手机服务器read数据错误导致有时候下载到手机的文件打开文字错乱问题

    1 .问题 手机客户端app通过java socket写了一个服务器,然后PC端通过浏览器访问服务端显示上传页面(这些资源都在手机端),然后其中有一个功能是PC端上传文件到手机服务器,然后把这个文件下 ...

  3. 解决不同浏览器上传文件filename不一样问题

    解决不同浏览器上传文件filename不一样问题(学习自用) 今天在做实验的时候发现在不同的浏览器上上传文件的filename不一致 在ie浏览器的结果 在chrom浏览器中却能成功 解决方案:

  4. java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法

    本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...

  5. 从服务器上传和下载文件方法

    1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...

  6. SecureCRT使用及解决securecrt rz 上传rar,gif文件不正确问题

    安装SecureCRT版本为SecureCR+SecureFX 的整合版,下载见 http://www.portablesoft.org/securecrt-securefx-integrated/ ...

  7. Linux中使用SCP命令进行上传或者下载文件

    本文目录 1.本地主机与远程主机之间进行文件传输 1.1.单个文件的上传与下载 1.2.多个文件的上传与下载 1.3.按目录进行上传与下载 2.远程主机与远程主机之间进行文件传输 SCP(Secure ...

  8. EasyExcel+elementUI+vue 上传、下载文件实例

    本文为 easyexcel使用具体实例,包含前后端代码,前端使用 vue + elementUI+axios,后端使用 spring boot. 1. 上传文件 1.1. 后端 1.1.1. 添加依赖 ...

  9. Python实现向s3共享存储上传和下载文件

    Python实现向s3共享存储上传和下载文件 https://www.cnblogs.com/liang545621/p/10298617.html 使用Python从S3上传和下载文件 https: ...

最新文章

  1. Oracle安装配置手册
  2. 【正一专栏】如果不是生活所迫,谁会愿意苟且
  3. 【struts2+hibernate+spring项目实战】java读写实现代码生成器(ssh)
  4. 在 VS Code 中轻松 review GitHub Pull Requests
  5. 深入浅出JVM-内存模型
  6. STM32 - 高级定时器的设定 - 基础-05 - 输出波形控制 -Complementary outputs and dead-time insertion 相位调整@互补输出和死区控制
  7. delphi 中如果不进行 closehandle 会怎么样_报考八一农大的十一大选择之七|带你走进不一样的“信息世界”...
  8. ListView和RecycleView的性能比对
  9. JZOJ 3455. 【NOIP2013模拟联考3】库特的向量(code)
  10. android JBOX2D粒子碰撞的实例,以达到特殊效果
  11. SitePoint播客#108:Kevin的最后一场演出
  12. 配电室综合监控系统 实现实时监控和 智能控制
  13. 科比生涯数据分析——利用随机森林进行分类
  14. win10删除微软拼音
  15. Pycharm2099破解
  16. 宣州谢脁楼饯别校书叔云
  17. android 微信刷步数,微信QQ自动手动刷步数支持98800步安卓应用
  18. python学习日记(基础数据类型及其方法02)
  19. php 漫画小偷程序,php简单小偷程序
  20. 如何让自己的网站快速被搜索引擎找到

热门文章

  1. 《基于混合方法的自然语言处理》译者序
  2. 二十八,打糕蒸馍贴花花
  3. simulink仿真技术简介
  4. oracle 中(+)是什么意思?
  5. 通过编程模式起底小程序开发技术特点
  6. 职高对口计算机应用资料,2020年湖南省职高对口计算机应用综合试卷(三校联考)...
  7. 手把手教你搭建 IBM Waston(聊天机器人)
  8. AI会让我们失业吗?
  9. 刚刚出炉的 IrisSkin,来个鲜的(附:换肤控件对比)
  10. 时间服务器(time server)名单