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

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

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

Python使用国内镜像加速pip安装的方法讲解

《Python使用国内镜像加速pip安装的方法讲解》在Python开发中,pip是一个非常重要的工具,用于安装和管理Python的第三方库,然而,在国内使用pip安装依赖时,往往会因为网络问题而导致速... 目录一、pip 工具简介1. 什么是 pip?2. 什么是 -i 参数?二、国内镜像源的选择三、如何

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Linux使用nload监控网络流量的方法

《Linux使用nload监控网络流量的方法》Linux中的nload命令是一个用于实时监控网络流量的工具,它提供了传入和传出流量的可视化表示,帮助用户一目了然地了解网络活动,本文给大家介绍了Linu... 目录简介安装示例用法基础用法指定网络接口限制显示特定流量类型指定刷新率设置流量速率的显示单位监控多个

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::