SpringBoot 文件下载功能 IE浏览器汉字乱码问题

2023-11-17

问题描述:今天在实现文件下载并指定文件名称时,遇到文件下载在Google 浏览器下载正常,指定文件名称汉字未乱码,但是在IE11 浏览器上,指定文件名称汉字乱码。

问题产生原因:

  1. Chrome浏览器可以自动执行两次URL解码,所以下载的文件名是正常。
  2. IE浏览器只执行一次URL解码,所以下载的文件名是乱码

解决思路:筛选请求头信息,判别是IE浏览器还是Google 浏览器,对文件名称做对应处理

Chrome 浏览器指定文件下载名称仅重新指定编码格式="ISO-8859-1"

IE浏览器指定文件下载名称需要进行URLEncoder.encode 加码,并指定编码格式"utf-8"

 

核心功能代码:

判断浏览器是否为IE:

	/**
     * 判断是否是IE浏览器
     * 
     * @param userAgent
     * @return
     */
    public static boolean isIE(HttpServletRequest request) {
        String userAgent = request.getHeader("User-Agent").toLowerCase();
        boolean isIe = false;
        if (userAgent.contains("msie") || userAgent.contains("trident") || userAgent.contains("edge")) {
        	isIe = true;
        }
        return isIe;
    }

文件下载核心功能代码:

@ApiOperation(value = "指定文件ZIP下载 ")
	@RequestMapping(value="/viewZip",  method= {RequestMethod.GET})
	public void viewZip(@RequestParam @ApiParam(name="sid", value="sid", required= true) Long sid,HttpServletResponse response) throws UnsupportedEncodingException {
		HttpServletRequest request = HttpContextUtils.getRequest();
		//TODO 根据文件所属(工程,案卷)验证权限,没有权限抛出异常.
		UserDownload download = userDownloadService.selectByPrimaryKey(sid);
		String pdfDir = null;
		
		if(download != null){
			pdfDir = transPath(download.getDownloadAddress());
			if(StringUtils.isNotEmpty(pdfDir)){
				File file = new File(pdfDir);
				response.setContentType("application/octet-stream");
				response.setHeader("Pragma", "No-cache");
				response.setHeader("Cache-Control", "no-cache");
				response.setDateHeader("Expires", 0);
				response.addHeader("Content-Length", "" + file.length());
				if(isIE(request)){
					response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", URLEncoder.encode(file.getName(), "utf-8")));  
				} else {
					response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", new String(file.getName().getBytes(),"ISO-8859-1")));  
				}


				BufferedInputStream bufferedStream = null;
				ServletOutputStream ros = null;
				try {
					// 打开指定文件的流信息
					bufferedStream = new BufferedInputStream(new FileInputStream(file));
					ros = response.getOutputStream();
					// 写出流信息
					int i;
					while ((i = bufferedStream.read()) != -1) {
						ros.write(i);
					}
					ros.flush();
				} catch (Exception e) {
					log.error("文件路径读取异常 : "+ pdfDir);
				} finally {
					IOUtils.closeQuietly(bufferedStream);
					IOUtils.closeQuietly(ros);
				}
			}else{
				log.warn("非法访问未授权文件" + JacksonUtil.toJson(securityUtils.getAuthUserDetails(request)));
			}
		}
	}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot 文件下载功能 IE浏览器汉字乱码问题 的相关文章

随机推荐

  • 1Panel 安装部署

    1Panel 是一个现代化 开源的 Linux 服务器运维管理面板 1 环境要求 安装前请确保您的系统符合安装条件 操作系统 支持主流 Linux 发行版本 基于 Debian RedHat 包括国产操作系统 服务器架构 x86 64 aa
  • Limit

    Mysql limit用法 select from test LIMIT 3 当 limit后面跟一个参数的时候 该参数表示要取的数据的数量 表示直接取前三条数据 以下的两种方式均表示取2 3 4三条条数据 select from test
  • R语言深度学习:智能客服聊天机器人

    目录 一 准备工作 二 数据预处理 三 构建模型 1 准备训练数据 2 构建seq2seq模型
  • Ubuntu18.04安装docker及nvidia docker、NVIDIA Container Toolkit

    1 卸载旧版docker sudo apt get remove docker sudo apt get remove auto remove docker sudo apt remove docker ce 如果上面方法都不行直接 使用d
  • PID控制算法学习与Matlab仿真

    文章目录 起因 算法原理 算法解析 调参小技巧 Matlab仿真 起因 PID控制算法应该是包括工业机器人等各种行业和领域中非常常用的一种控制算法了 了解这个算法的起因是在稚晖君开发的自行车项目中见到 后来在北理工组会中了解到PID控制算法
  • ssrf漏洞描述

    ssrf是一种由攻击者构造请求 由服务端发起请求的安全漏洞 一般情况下 ssrf攻击的目标是外网无法访问的内部系统 ssrf漏洞原理 ssrf的形成大多是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制 例如 服务
  • 玄铁C910总览

    一 开源玄铁C910简介 玄铁C910是由平头哥设计并开源的高性能CPU 基于开源的RISC V指令集 主要面向对性能要求严格的边缘计算领域 如边缘服务器 边缘计算卡 高端机器视觉 高端视频监控 自动驾驶 移动智能终端 5G 基站等 玄铁C
  • SAP-ABAP-DOI技术的优化与说明

    SAP ABAP DOI技术的优化与说明 阅后感 不错的一篇文章 自己收藏下 顺带分享给众人 看完本文章后 大家也可以学习下 DOI 的API文档 当有需求直接下载本地时 可以应用CALL i oi document proxy的一个方法S
  • c# 访问共享文件夹 用户名或密码不正确 及 拒绝访问

    组策略 计算机配置 Windows设置 安全设置 本地策略 安全选项 网络访问 本地帐户的共享和安全模型 改为 经典 本地用户以自己身份验证 不改会出现用户名和密码错误 拒绝访问 安全里添加用户
  • day075:XML的约束:DTD约束文档、DTD约束文档的三种引入方法、DTD语法规则

    目录 一 DTD约束 1 什么是DTD约束 2 创建DTD约束文档的步骤 3 代码示例 4 引入DTD约束文档的三种方法 1 引入本地DTD约束文档 2 在xml文件内部引入 3 从网络引入dtd文件 二 DTD语法规则 DTD定义元素 标
  • CodeForces 1025C Plasticine zebra

    题目大意 题目链接 给定一个由w和b组成的字符串 可以操作任意次 每次操作 0次或多次 可以将字符串分割成左右两个子串 左 右侧子串均前后颠倒 问最终字符串中最多可以有多少个w和b交错 w和b无所谓顺序 题解 构造 比较好想 总述 当最左端
  • Stable-Diffusion-WebUI从代码下载到使用技巧

    一 写在前面 本文用于对AI绘画感兴趣但无计算机编程基础的人 包含本人安装和使用过程中的心得 可供新学者参考 心理准备 电脑性能越高越好 最好有高端显卡 如30系以上 低端显卡也可以 速度和质量感人就是 会要求下载一些软件 模型 涉及环境变
  • 判断一个点是否在圆内(三点确定一个圆)

    三角形的外接圆圆心是任意两边的垂直平分线的交点 三角形外接圆圆心叫外心
  • element的滚动去掉横向_textarea去掉滚动条 textarea横向或纵向滚动条的去掉方法

    在IE下文本框textarea会显示滚动条 如下 去掉textarea横向或纵向滚动条办法 可以通过overflow x hidden和overflow y hidden控制横向和纵向滚动条 要设置textarea文本域的滚动条是否开启 使
  • 30 个 Python 教程和技巧

    如果您让任何 Python 程序员讲述 Python 的优势 他会引用简洁和高可读性作为最有影响力的优势 在本 Python 教程中 我们将介绍许多基本的 Python 教程和技巧 这些技巧和技巧将验证上述两点 自从我开始使用 Python
  • 四年Android面试遇到的问题整理,算法太TM重要了

    何为成长 成长是指自我提升 一方面是本身的个人能力 另一方面是社会对你的认可度 最终 程序员的职位和薪水都能在成长中得以体现 很多人对成长有误解 在他们眼中 随着工作年限的提高 成长是理所当然的事情 这其实是一个误区 两个程序员同时工作3年
  • 解决大批量数据导出Excel产生内存溢出的方案

    相关文章 java操作Excel PDF文件 Java操作Excel之理解JXL 读取Excel Java操作Excel之理解JXL 读取Excel模板动态写入数据并生成Excel 推荐圈子 GT Grid 更多相关推荐 POI或者JXL在
  • l05173芯片针脚图_芯片引脚定义

    电源管理芯片引脚定义 1 AGND GND PGND 模拟地 地线 电源地 2 BOOT 次级驱动信号器过流保护输入端 3 COMP 电流补偿控制引脚 4 CT 定时电容 5 DRIVE cpu 外核场管驱动信号输出 6 FAULT 过耗指
  • Protues 8.7:i8086.DLL failed to create DSIM model

    如图所示 8086报错 解决一 换版本 如Protues 7 8 解决二 有的版本i8086 DLL文件不好用 使用这个 链接 https pan baidu com s 1eKniBmf7xJJHwPAxX8dQBg 提取码 8086 文
  • SpringBoot 文件下载功能 IE浏览器汉字乱码问题

    问题描述 今天在实现文件下载并指定文件名称时 遇到文件下载在Google 浏览器下载正常 指定文件名称汉字未乱码 但是在IE11 浏览器上 指定文件名称汉字乱码 问题产生原因 Chrome浏览器可以自动执行两次URL解码 所以下载的文件名是