解决常用浏览器上传与下载文件中问乱码问题
解决浏览器下载与上传文件中问乱码问题
问题:
我们在写后端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韩振国
完美解决…
解决常用浏览器上传与下载文件中问乱码问题相关推荐
- linux securefx 传输文件失败,解惑:如何使用SecureCRT上传和下载文件、SecureFX乱码问题...
解惑:如何使用SecureCRT上传和下载文件.SecureFX乱码问题 一.前言 很多时候在windows平台上访问Linux系统的比较好用的工具之一就是SecureCRT了,下面介绍一下这个软件的 ...
- Android之解决PC浏览器上传表单文件到手机服务器read数据错误导致有时候下载到手机的文件打开文字错乱问题
1 .问题 手机客户端app通过java socket写了一个服务器,然后PC端通过浏览器访问服务端显示上传页面(这些资源都在手机端),然后其中有一个功能是PC端上传文件到手机服务器,然后把这个文件下 ...
- 解决不同浏览器上传文件filename不一样问题
解决不同浏览器上传文件filename不一样问题(学习自用) 今天在做实验的时候发现在不同的浏览器上上传文件的filename不一致 在ie浏览器的结果 在chrom浏览器中却能成功 解决方案:
- java http 下载文件_JAVA通过HttpURLConnection 上传和下载文件的方法
本文介绍了JAVA通过HttpURLConnection 上传和下载文件的方法,分享给大家,具体如下: HttpURLConnection文件上传 HttpURLConnection采用模拟浏览器上传 ...
- 从服务器上传和下载文件方法
1. ssh 安装SSH Secure Shell Client客户端 下载链接 http://download.csdn.net/detail/jiandanjinxin/9755684 使用方法参 ...
- SecureCRT使用及解决securecrt rz 上传rar,gif文件不正确问题
安装SecureCRT版本为SecureCR+SecureFX 的整合版,下载见 http://www.portablesoft.org/securecrt-securefx-integrated/ ...
- Linux中使用SCP命令进行上传或者下载文件
本文目录 1.本地主机与远程主机之间进行文件传输 1.1.单个文件的上传与下载 1.2.多个文件的上传与下载 1.3.按目录进行上传与下载 2.远程主机与远程主机之间进行文件传输 SCP(Secure ...
- EasyExcel+elementUI+vue 上传、下载文件实例
本文为 easyexcel使用具体实例,包含前后端代码,前端使用 vue + elementUI+axios,后端使用 spring boot. 1. 上传文件 1.1. 后端 1.1.1. 添加依赖 ...
- Python实现向s3共享存储上传和下载文件
Python实现向s3共享存储上传和下载文件 https://www.cnblogs.com/liang545621/p/10298617.html 使用Python从S3上传和下载文件 https: ...
最新文章
- Oracle安装配置手册
- 【正一专栏】如果不是生活所迫,谁会愿意苟且
- 【struts2+hibernate+spring项目实战】java读写实现代码生成器(ssh)
- 在 VS Code 中轻松 review GitHub Pull Requests
- 深入浅出JVM-内存模型
- STM32 - 高级定时器的设定 - 基础-05 - 输出波形控制 -Complementary outputs and dead-time insertion 相位调整@互补输出和死区控制
- delphi 中如果不进行 closehandle 会怎么样_报考八一农大的十一大选择之七|带你走进不一样的“信息世界”...
- ListView和RecycleView的性能比对
- JZOJ 3455. 【NOIP2013模拟联考3】库特的向量(code)
- android JBOX2D粒子碰撞的实例,以达到特殊效果
- SitePoint播客#108:Kevin的最后一场演出
- 配电室综合监控系统 实现实时监控和 智能控制
- 科比生涯数据分析——利用随机森林进行分类
- win10删除微软拼音
- Pycharm2099破解
- 宣州谢脁楼饯别校书叔云
- android 微信刷步数,微信QQ自动手动刷步数支持98800步安卓应用
- python学习日记(基础数据类型及其方法02)
- php 漫画小偷程序,php简单小偷程序
- 如何让自己的网站快速被搜索引擎找到