前言

问题展示

解决


前言

在这里我们演示了文件下载文件下载

问题展示

但是文件名有中文时会出现问题

文件,我们给 图片取了个中文名,美女

Servlet层代码

package com.lingaolu.download;import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;/*** @author 林高禄* @create 2020-07-14-9:11*/
@WebServlet("/dowmloadFile1")
public class DowmloadFile1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取文件名String fileName = request.getParameter("fileName");// 获取文件的MIME类型ServletContext servletContext = this.getServletContext();String mimeType = servletContext.getMimeType(fileName);// 获取文件的真实路径String realPath = servletContext.getRealPath("/file/" + fileName);// 将文件读入内存FileInputStream fis = new FileInputStream(realPath);// 设置相应头类型response.setHeader("content-type",mimeType);response.setHeader("content-disposition","attachment;filename="+fileName);// 将文件写出浏览器ServletOutputStream outputStream = response.getOutputStream();int len;byte[] by = new byte[1024*8];while((len = fis.read(by)) != -1){outputStream.write(by,0,len);}fis.close();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request,response);}
}

启动谷歌浏览器访问,单击图片,中文名变成了_

火狐浏览器访问,单击图片,中文名没有了

IE浏览器访问,单击图片,直接报错了,是因为IE浏览器版本太低了,不需要管

解决

因为每个浏览器出现的问题不一样,这是因为不同的浏览器的编码方式不一样,这个就需要我们针对不同的浏览器判断进行设置不同的编码方式

添加一个工具类DownLoadUtils,根据不同的浏览器进行不同的编码处理

package com.lingaolu.utils;import sun.misc.BASE64Encoder;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;public class DownLoadUtils {public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {if (agent.contains("MSIE")) {// IE浏览器filename = URLEncoder.encode(filename, "utf-8");filename = filename.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐浏览器BASE64Encoder base64Encoder = new BASE64Encoder();filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";} else {// 其它浏览器filename = URLEncoder.encode(filename, "utf-8");}return filename;}
}

Servlet层代码

package com.lingaolu.download;import com.lingaolu.utils.DownLoadUtils;import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.*;/*** @author 林高禄* @create 2020-07-14-9:11*/
@WebServlet("/dowmloadFile1")
public class DowmloadFile1 extends HttpServlet {@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// 获取文件名String fileName = request.getParameter("fileName");// 获取文件的MIME类型ServletContext servletContext = this.getServletContext();String mimeType = servletContext.getMimeType(fileName);// 获取文件的真实路径String realPath = servletContext.getRealPath("/file/" + fileName);// 将文件读入内存FileInputStream fis = new FileInputStream(realPath);// 获取user-agent请求头String agent = request.getHeader("user-agent");// 调用工具类,不同的浏览器进行不同的编码处理fileName = DownLoadUtils.getFileName(agent, fileName);// 设置相应头类型response.setHeader("content-type", mimeType);response.setHeader("content-disposition", "attachment;filename=" + fileName);// 将文件写出浏览器ServletOutputStream outputStream = response.getOutputStream();int len;byte[] by = new byte[1024 * 8];while ((len = fis.read(by)) != -1) {outputStream.write(by, 0, len);}fis.close();}@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {this.doPost(request, response);}
}

启动,谷歌浏览器访问,单击图片,中文名解决了

火狐浏览器访问,单击图片,中文名解决了

文件下载文件中文名问题相关推荐

  1. linux 解压 文件 中文名乱码

    背景:window 下通过压缩软件对文件夹进行压缩后,上传到linux 服务器上,进行解压. 问题:出现中文名名称的文件乱码 尝试解决方案: 1.解压根据 指定编码解压. #CP936   其实就是G ...

  2. centos系统 文件中文名乱码问题解决

    今天遇到一个问题,centos服务器里面的中文名文件乱码了,导致程序读取不到对应的文件(因为程序没有源码,无法将程序中读取文件的名称改为非中文) 一开始以为是系统编码问题,改了编码,发现还是乱码.于是 ...

  3. java文件下载文件损坏_Springboot实现文件下载,文件下载后损坏

    场景描述 使用Springboot实现了一个文件下载的功能,代码如下 String fileName = "template.xls"; res.setHeader("C ...

  4. python打开文件中文名_windows下Python打开包含中文路径名文件

    windows使用gbx(gb2312,gbk,gb18030我也不知道是哪个)对文件名及文件路径进行编码保存.打开文件的函数中使用诸如open(filename.encode('gbk'))可以很好 ...

  5. FTP下载文件中文名乱码FTP访问

    tomcat字符集编码格式没统一, 修改配置文件server.xml文件   添加URIEncoding="utf-8" <Connector port="8088 ...

  6. SRT上传文件下载文件

    用 alt + p 打开 sftp 文件传输窗口 然后就是和普通Linux一样的, pwd ls cd 这是在Linux主机上进行移动的目录 lpwd lls lcd 这是在本机上进行移动的目录(实际 ...

  7. 正确处理下载文件时HTTP头的编码问题(Content-Disposition),safari下载文件 中文名乱码问题

    目前支持ie9-11,firefox63.0,chrome69.0,qq10.2.1的版本,safari的最新版本(特别是解决mac下的safari中,下载文件的中文文件名问题). 下载文件时, 设置 ...

  8. go gin增删改查上传文件下载文件

    一.依赖 module maingo 1.15require (github.com/gin-contrib/static v0.0.0-20200916080430-d45d9a37d28egith ...

  9. linux64下调用海康sdk(=登陆、获取通道列表、获取文件列表、按照文件下载文件、按照时间下载文件)

    linux下调用海康sdk 1.库文件的配置 mkdir /data/hk_sdk/ cd /data/hk_sdk/将海康SDK的lib文件夹复制到/data/hk_sdk/下 lib文件下面的结构 ...

  10. SpringBoot从入门到精通-说说Excel文件下载文件解决 格式和扩展名不匹配。文件可能已损坏或不安全

    网上找了很多文章但是都是excel下载后弹框提示格式损害,打开乱码,后来找到一篇文章,因为excel模板文件是放在resource下面的,maven打包时进行了压缩,导致下载的excel文件格式损害. ...

最新文章

  1. 图论(四)------非负权有向图的单源最短路径问题,Dijkstra算法
  2. pl/sql command window 初步接触
  3. sqlserver拼接sql插入table_10个SQL技巧
  4. 疯狂ios之cocos2d中的文本
  5. 初始化 数组 java_如何用Java初始化数组
  6. 察看无限网络linux,linux 无线网络调试
  7. sniffer辅助功能详解
  8. 第1章 Pandas基础操作(使用pandas进行数据分析,从小白逆袭大神,你会了吗?)
  9. VS2019完全卸载教程
  10. (Linux)误删文件恢复命令及方法
  11. 我的世界java版上网的mod_我的世界Minecraft Mod(模组)安装指南
  12. 期货平仓/强制平仓/爆仓-股市平仓建仓
  13. word关闭时卡死_如何修复卡死的Mac
  14. C 语言还值得学习吗?C 语言会过时吗?C 语言解惑
  15. Windows 10 缺少 efi 分区无法启动的修复
  16. 生成32位,16进制的UUID
  17. mysql关联删除(删除不存在另一张表的记录)
  18. 开源中国(OSChina)源码解析(2)——闪屏页
  19. Unity UGUI图文混排(七) -- 下划线
  20. docker privileged

热门文章

  1. 整合+策略:微网通联的GMP平台如何帮助企业搭建统一智慧通信架构
  2. 北航大学计算机学院新媒体艺术系,本科优秀毕业论文参考-北航新媒体与艺术学院-北京航空航天大学.doc...
  3. [課程筆記] 機器學習2021(李弘毅) L13. Transformer (下)
  4. 内存屏障 Memery Barrier
  5. Processing编写熊猫
  6. python爬取qq音乐下载歌曲
  7. 22年QQ号被盗,好友协助验证却申诉无效
  8. 服装尺寸 html,服装尺寸表
  9. 计算机桌面图标多一个箭头,怎么去掉电脑桌面图标箭头(一个小妙招解决win图标小箭头)...
  10. 中英对照泰戈尔《飞鸟集》(一)