baseresponse响应类_Java response响应体和文件下载实现原理

通过response 设置响应体:

响应体设置文本:

PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览 器端。

关于设置中文的乱码问题

原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过 response的setCharacterEncoding(String charset) 设置response的编码,

但我们发现客户端还是不能正常显示文字。

原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。

我们还可以在代码中指定浏览器解析页面的编码方式,通过response的setContentType(String type)方法指定页面解析时的编码是UTF-8。

response.setContentType("text/html;charset=UTF-8");

上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含 setCharacterEncoding的功能,所以在实际开发中只要编写 response.setContentType("text/html;charset=UTF-8"),就可以解决页面输出中文乱码问题。

package com.oracle;

import java.io.FileInputStream;

import java.io.IOException;

import java.net.URLEncoder;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Encoder;

public class DownloadServlet extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//服务器获取文件名(文件名是中文的话,获取的时候就成了乱码了)

String filename = request.getParameter("file");//??.png

//get请求中---解决文件名中文乱码问题

filename =new String(filename.getBytes("ISO-8859-1"),"UTF-8");//乱码.png

//获取User-Agent获取客户端浏览器到底是哪个浏览器

String agent=request.getHeader("User-Agent");

String filenameEncoder="";

if (agent.contains("MSIE")) {

// IE浏览器

filenameEncoder= URLEncoder.encode(filename, "utf-8");

filenameEncoder= filenameEncoder.replace("+", " ");

} else if (agent.contains("Firefox")) {

// 火狐浏览器

BASE64Encoder base64Encoder = new BASE64Encoder();

filenameEncoder= "=?utf-8?B?"

+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";

} else {

// 其它浏览器

filenameEncoder= URLEncoder.encode(filename, "utf-8");

}

//告知浏览器文件的类型(响应体)

response.setContentType(getServletContext().getMimeType(filename));

//告知浏览器以附件的方式提供下载功能 而不是解析

response.setHeader("Content-Disposition","attachment;filename="+filenameEncoder);

//服务器获取后开始进行复制的程序:获取字节输出流

ServletOutputStream sos = response.getOutputStream();

//获取数据源的绝对路径

String realpath = getServletContext().getRealPath("download/"+filename);

//获取字节输入流

FileInputStream fis =new FileInputStream(realpath);

//开始复制

byte[] bytes=new byte[1024];

int len=0;

while((len=fis.read(bytes))!=-1){

sos.write(bytes, 0, len);

}

//释放资源

fis.close();

}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doGet(request, response);

}

}

pageEncoding="UTF-8"%>

Insert title here

a.txt

a.wmv

科比.png

a.zip

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304934.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

测试Live Write的插件

1、文字竖排: 删除,只因首页显示时太占空间。2、酷表情:3、Rhapsody SongI am listening to Sad Songs And Waltzes by Cake . Rhapsody.

手把手教你用7行代码实现微信聊天机器人 -- Python wxpy

环境要求: Windows / Linux / Mac OS Python 3.4-3.6,以及 2.7 版本 wxpy安装 ## 使用国内源安装速度快 pip install -U wxpy -i "https://pypi.doubanio.com/simple/" 实例 让机器人与所有好友聊天 from wxpy import * # 实例化,并…

Dapr 已在塔架就位 将发射新一代微服务

微服务是云原生架构的核心,通常使用Kubernetes 来按需管理服务扩展。微软一直走在 Cloud Native Computing Foundation的 最前沿,并通过使用Kubernetes来支持其超大规模Azure和其混合云Azure Stack,微软对云原生的投资一部分来自其工具&#…

python 复制文件_10 行 Python 代码写 1 个 USB 病毒

(给Python开发者加星标,提升Python技能)转自: 知乎-DeepWeaver昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序。查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索…

html5中外描边怎么写,CSS3实现文字描边的2种方法(小结)

问题最近遇到一个需求,需要实现文字的描边效果,如下图解决方法一首先想到去看CSS3有没有什么属性可以实现,后来被我找到了text-stroke该属性是一个复合属性,可以设置文字宽度和文字描边颜色该属性使用很简单:text-stro…

混凝土墙开洞_满城混凝土柱子切割资质齐全

满城混凝土柱子切割资质齐全专业楼板切割开洞,钢筋混凝土墙开门,开窗,开方洞。混泥土承重墙新开门洞、开窗、通风管道开洞、专业开楼梯口,楼梯口加固,地下室开门洞,水泥墙开门加固、楼板加固、砖墙开门开窗…

马云害怕的事还是发生了

当前,余额宝的收益维持在4%左右不能突破,只能用作“钱包”放点零钱了。 放银行或者余额宝收益偏低,股票市场又处于震荡周期,期货市场等不是普通人进得去的,还不如直接买较高收益的互联网理财产品。 比如屡受政策利好…

Unix操作系统***追踪反击战

阅读提示:在Unix系统遭受***后,确定损失及***者的***源地址相当重要。虽然在大多数***者懂得使用曾被他们攻陷的机器作为跳板来***你的服务器可在他们发动正式***前所做的目标信息收集工作(试探性扫描)常常是从他们的工作机开始的…

python才能做爬虫,No,C#也可以!

介绍网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模…

cmosfixr插件怎么用_3dmax插件神器|怎么用3dmax插件神器去完成背景墙的效果图设计?...

又到3dmax插件神器的小课堂时间了!小伙伴们还记得之前几张的知识点吗?如果不记得自己去温习,温故而知新哦!如果学会了,下面学习3dmax插件神器小技巧的第四章建模篇的第4.16小节:怎么用3dmax插件神器去完成背…

jsoup 获取html中body内容_jsoup实现java抓取网页内容

jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。jsoup的主要功能如下:1. 从一个URL,文件或字符串中解析…

html中label的寬度無法修改,如何设置HTML span、label 的宽度

该文讲述如何设定 HTML span 宽度。 缺省情况 HTML span 的宽度设定无效在 HTML 中如何设定 span 的宽度?这看上去是个很简单的问题,似乎用 style 中的 width 属性就可以。例如: /p>"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transit…

27个赢得别人欣赏的诀窍

1.长相不令人讨厌,如果长得不好,就让自己有才气;如果才气也没有,那就总是微笑。2.气质是关键。如果时尚学不好,宁愿纯朴。 3.与人握手时,可多握一会儿。真诚是宝。 4.不必什么都用“我”做主语。 5.不要向朋…

不懂这25个名词,好意思说你懂大数据?

如果你刚接触大数据,你可能会觉得这个领域很难以理解,无从下手。近日,Ramesh Dontha在DataConomy上连发两篇文章,扼要而全面地介绍了关于大数据的75个核心术语,这不仅是大数据初学者很好的入门资料,对于高阶…

您好,dotnet tool

在.net core发布之初,dotnet cli就诞生了,dotnet cli的作用是什么呢?主要是用来创建,还原,构建,发布,测试等一系统管理功能,本来,visual studio中是有这些功能的&#xf…

iphone4 base64 mp3 无法解析 html5,javascript - 如何使用HTML5在firefox上播放base64音频数据? - 堆栈内存溢出...

我正在尝试编码base64格式的mp3文件。 然后通过broswer播放。 它适用于safari和chrome,但不适用于Firefox 。我的问题是“有没有办法让firefox以base64 /二进制字符串格式播放音频文件?”ps:我知道firefox无法播放mp3,所以我尝试过…

ab压力测试_Apache ab压力测试的知识点

Apache-ab是著名的Web服务器软件Apache附带的一个小工具,它可以模拟多个并发请求,测试服务器的最大承载压力。ab 是apachebench的缩写,ab命令会创建多个并发访问线程,模拟多个访问者同时对某一URL地址进行访问。它的测试目标是基于URL的&…

现代云原生设计理念

前文传送门什么是云原生?现代设计理念你会如何设计云原生应用程序?需要遵循哪些原则、模式和最佳实践?需要特别关注哪些底层/操作?十二要素应用程序目前被普遍认可的基于云的方法论是"十二要素应用程序",它给…

NFS服务器架设篇

大家好,本周我们的课程是NFS服务器的架设。下面我们分几个部分来介绍NFS服务器。一、NFS简介NFS是分布式计算机系统的一部分,一般在用unix和类unix的系统上实现文件的传输。而且可以把NFS服务器共享的目录挂载到本地,使用cp,cd&am…

mysql 碎片率_MySQL数据碎片的整理和分析

MySQL具有相当多不同种类的存储引擎来实现列表中的数据存储功能。每当MySQL从你的列表中删除了一行内容,该段空间就会被留空。而在一段时间内的大量删除操作,会使这种留空的空间变得比存储列表内容所使用的空间更大。当MySQL对数据进行扫描时&#xff0c…