Java 使用IE浏览器下载文件,文件名乱码问题

简介: 使用Servlet实现文件下载功能时,使用IE下载出现文件名乱码;网上常见的解决办法是通过"user-agen"来判断浏览器:if (req.getHeader("user-agent").toLowerCase().

使用Servlet实现文件下载功能时,使用IE下载出现文件名乱码;

网上常见的解决办法是通过"user-agen"来判断浏览器:

if (req.getHeader("user-agent").toLowerCase().contains("msie")) {  
        // IE  
    filename = URLEncoder.encode(filename, "UTF-8");  
} else {  
        // 非IE  
    filename = new String(filename.getBytes("UTF-8"), "iso-8859-1");  
}  

但是在Windows 10 中 用户代理字符串已经修改了  不在是"msie"了

  • 兼容("兼容")和浏览器 ("MSIE") 令牌已删除。
  • "like Gecko" 令牌已添加(以便与其他浏览器一致)。
  • 浏览器版本现在由新版本 ("rv") 令牌报告。
win 10 ie user-agent
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko ie 11
win 10 edge user-agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393 edge
 
所以就不能在使用msie判断是否是IE 浏览器.
String userAgent = req.getHeader("user-agent").toLowerCase();  
  
if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {  
        // win10 ie edge 浏览器 和其他系统的ie  
    fileName = URLEncoder.encode(fileName, "UTF-8");  
} else {  
        // fe  
    fileName = new String(fileName.getBytes("UTF-8"), "iso-8859-1");  
}  

 

项目示例代码:

try {
                String fileName = attachmentFile.originalName();
                String userAgent = request.getHeader("user-agent").toLowerCase();  
                if (userAgent.contains("msie") || userAgent.contains("like gecko") ) {  
                        // win10 ie edge 浏览器 和其他系统的ie  
                    fileName = URLEncoder.encode(fileName, "UTF-8");  
                } else {  
                        // fe  
                    fileName = new String(fileName.getBytes("utf-8"), "iso-8859-1");  
                }  
                response.setCharacterEncoding("utf-8");
                response.setContentType("multipart/form-data");
                response.setHeader("Content-Disposition",
                        "attachment;fileName=" + fileName);
                String path = attachmentFile.path();
                InputStream inputStream = new FileInputStream(new File(path));

                OutputStream os = response.getOutputStream();
                byte[] b = new byte[2048];
                int length;
                while ((length = inputStream.read(b)) > 0) {
                    os.write(b, 0, length);
                }

                // 这里主要关闭。
                os.close();

                inputStream.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

 

目录
打赏
0
0
0
0
6
分享
相关文章
|
11月前
|
浏览器插件crx文件--JS混淆与解密
浏览器插件crx文件--JS混淆与解密
251 0
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
【5月更文挑战第20天】本文介绍了自动化测试中如何实现无弹窗下载文件,主要针对Firefox浏览器。作者指出,通常的下载操作包括点击下载按钮,但这里讨论的是避免下载弹窗直接保存文件的方法。文章详细讲解了通过设置Firefox参数(如`browser.download.dir`、`browser.helperApps.neverAsk.saveToDisk`等)来实现这一功能,并给出了Java Selenium的示例代码,展示了如何创建FirefoxProfile并进行相关设置,以及如何启动浏览器和执行下载操作。
205 0
《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)
|
8月前
|
为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
为什么浏览器中有些图片、PDF等文件点击后有些是预览,有些是下载
389 0
WIN11 Chrome 双击打不开闪退及Chrome浏览器不能拖拽文件crx
【11月更文挑战第6天】本文介绍了 WIN11 系统中 Chrome 浏览器双击打不开闪退及不能拖拽文件 crx 的原因和解决方法。包括浏览器版本过旧、扩展程序冲突、硬件加速问题、缓存过多、安全软件冲突、系统文件损坏、用户配置文件损坏等问题的解决方案,以及 crx 文件的屏蔽、权限问题和文件格式问题的处理方法。
690 2
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
Java与JavaScript的区别与联系:有人的地方就有江湖,有浏览器的地方就有JavaScript
479 0
edge浏览器加载java插件
edge浏览器加载java插件
456 1
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
270 2
|
8月前
|
【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题
【Azure Function App】Java Function部署到Azure后出现中文显示乱码问题
【Azure Developer】浏览器查看本地数据文件时遇见跨域问题(CORS)
【Azure Developer】浏览器查看本地数据文件时遇见跨域问题(CORS)
【Azure Developer】浏览器查看本地数据文件时遇见跨域问题(CORS)

热门文章

最新文章