文件下载(下载文件名乱码解决方法)

2024-06-20 01:18

本文主要是介绍文件下载(下载文件名乱码解决方法),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


1. 下载就是向客户端响应字节数据!
原来我们响应的都是html的字符数据!
把一个文件变成字节数组,使用response.getOutputStream()来各应给浏览器!!!

2. 下载的要求
* 两个头一个流!
> Content-Type:你传递给客户端的文件是什么MIME类型,例如:image/pjpeg
* 通过文件名称调用ServletContext的getMimeType()方法,得到MIME类型!
> Content-Disposition:它的默认值为inline,表示在浏览器窗口中打开!attachment;filename=xxx
* 在filename=后面跟随的是显示在下载框中的文件名称!
> 流:要下载的文件数据!
* 自己new一个输入流即可!
3、下载的细节
显示在下载框中的中文名称时,会出现乱码。
* FireFox:Base64编码。
*Safari:ISO8859-1编码
* 其他大部分浏览器:URL编码。
通用方案:
 1    public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
 2         String agent = request.getHeader("User-Agent"); //获取浏览器
 3         if (agent.contains("Firefox")) {
 4             BASE64Encoder base64Encoder = new BASE64Encoder();
 5             filename = "=?utf-8?B?"
 6                       base64Encoder.encode(filename.getBytes("utf-8"))
 7                       "?=";
 8         } else if(agent.contains("MSIE")) {
 9             filename = URLEncoder.encode(filename, "utf-8");
10         } else if(agent.contains ("Safari")) {
11             filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
12         } else {
13             filename = URLEncoder.encode(filename, "utf-8");
14         }
15         return filename;
16     }

 4、演示:

 1 package web.servlet;
 2 
 3 import org.apache.commons.io.IOUtils;
 4 import sun.misc.BASE64Encoder;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.ServletOutputStream;
 8 import javax.servlet.annotation.WebServlet;
 9 import javax.servlet.http.HttpServlet;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletResponse;
12 import java.io.FileInputStream;
13 import java.io.IOException;
14 import java.net.URLEncoder;
15 
16 @WebServlet(name = "Download1Servlet",urlPatterns = "/Download1Servlet")
17 public class Download1Servlet extends HttpServlet {
18     public void doGet(HttpServletRequest request, HttpServletResponse response)
19             throws ServletException, IOException {
20         /*
21          *  两个头一个流
22          *  1、Content-Type
23          *  2、Content-Disposition
24          *  3、流:下载文件的数据
25          * */
26         String filename = "/Users/Shared/薛之谦-一半.mp3";
27         String framename = filenameEncoding("薛之谦-一半.mp3",request);
28         String contentType = this.getServletContext()
29                 .getMimeType(filename);//通过文件名获取MIME类型
30         String contentDisposition = "attachment;filename=" framename;
31         //一个流
32         FileInputStream input = new FileInputStream("/Users/Shared/薛之谦-一半.mp3");
33         //设置头
34         response.setHeader("content-Type",contentType);
35         response.setHeader("content-Disposition",contentDisposition);
36         //获取绑定了响应端的流
37         ServletOutputStream output = response.getOutputStream();
38         IOUtils.copy(input,output);//把输出流中的数据写入到输出流中
39         input.close();
40     }
41   public static String filenameEncoding(String filename, HttpServletRequest request) throws IOException {
42         String agent = request.getHeader("User-Agent"); //获取浏览器
43         if (agent.contains("Firefox")) {
44             BASE64Encoder base64Encoder = new BASE64Encoder();
45             filename = "=?utf-8?B?"
46                       base64Encoder.encode(filename.getBytes("utf-8"))
47                       "?=";
48         } else if(agent.contains("MSIE")) {
49             filename = URLEncoder.encode(filename, "utf-8");
50         } else if(agent.contains ("Safari")) {
51             filename = new String (filename.getBytes ("utf-8"),"ISO8859-1");
52         } else {
53             filename = URLEncoder.encode(filename, "utf-8");
54         }
55         return filename;
56     }
57 }

 

这篇关于文件下载(下载文件名乱码解决方法)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1076687

相关文章

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

Nginx安全防护的多种方法

《Nginx安全防护的多种方法》在生产环境中,需要隐藏Nginx的版本号,以避免泄漏Nginx的版本,使攻击者不能针对特定版本进行攻击,下面就来介绍一下Nginx安全防护的方法,感兴趣的可以了解一下... 目录核心安全配置1.编译安装 Nginx2.隐藏版本号3.限制危险请求方法4.请求限制(CC攻击防御)

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

MyBatis-Plus通用中等、大量数据分批查询和处理方法

《MyBatis-Plus通用中等、大量数据分批查询和处理方法》文章介绍MyBatis-Plus分页查询处理,通过函数式接口与Lambda表达式实现通用逻辑,方法抽象但功能强大,建议扩展分批处理及流式... 目录函数式接口获取分页数据接口数据处理接口通用逻辑工具类使用方法简单查询自定义查询方法总结函数式接口