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

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

相关文章

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

Python下载Pandas包的步骤

《Python下载Pandas包的步骤》:本文主要介绍Python下载Pandas包的步骤,在python中安装pandas库,我采取的方法是用PIP的方法在Python目标位置进行安装,本文给大... 目录安装步骤1、首先找到我们安装python的目录2、使用命令行到Python安装目录下3、我们回到Py

springboot报错Invalid bound statement (not found)的解决

《springboot报错Invalidboundstatement(notfound)的解决》本文主要介绍了springboot报错Invalidboundstatement(not... 目录一. 问题描述二.解决问题三. 添加配置项 四.其他的解决方案4.1 Mapper 接口与 XML 文件不匹配

Python中ModuleNotFoundError: No module named ‘timm’的错误解决

《Python中ModuleNotFoundError:Nomodulenamed‘timm’的错误解决》本文主要介绍了Python中ModuleNotFoundError:Nomodulen... 目录一、引言二、错误原因分析三、解决办法1.安装timm模块2. 检查python环境3. 解决安装路径问题