Servlet的学习之Response响应对象(2)
本篇接上一篇《Servlet的学习之Response响应对象(1)》,继续从HttpServletResponse响应对象来介绍其方法和功能。
使用setHeader方法结合HTTP协议的content-disposition响应头可以将某些web资源以下载方式回传给客户端。但是在下载中文文件的时候会有一些问题,这问题会怎么发生呢?
我们现在来进行从客户端向服务器端下载一个图片文件,先在MyEclipse的自创建【myservlet】web工程下准备一个图片文件,放置在web目录下的【download】文件夹中:

创建名为ServletResponse的Servlet,代码如下:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { //1,获取将要下载的文件路径和文件名
ServletContext context = this.getServletContext();
String filePath = context.getRealPath("/download/银魂全家福.jpg");
String fileName = filePath.substring(filePath.lastIndexOf("\\")+1); //2,使用HTTP协议的Content-Disposition请求头告诉客户端以下载方式接受这个数据(文件)
response.setHeader("content-disposition", "attachment;filename="+fileName); //3,通过流向响应对象写数据实体,然后由响应对象提交给客户端
FileInputStream fis = null;
try{
OutputStream out = response.getOutputStream();
fis = new FileInputStream(filePath);
byte[] buff = new byte[1024];
int len = 0;
while((len =fis.read(buff))>0) {
out.write(buff, 0, len);
}
}
finally {
if(fis!=null) {
fis.close();
}
}
}
而这样,当在浏览器中访问该Servlet时就会出现下载请求的弹窗:

这里就有一个问题了,下载文件的名称不对,如果是英文文件名就不会出现这个问题,而中文文件名就必须通过URL编码:
将上述代码中的response.setHeader("content-disposition", "attachment;filename="+fileName);
改为:response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(fileName, "UTF-8")); 即可。
我们重新发布该工程,然后再在浏览器中访问该Servlet,看到这回的下载弹窗:

这回就可以下载了,当我们下载后就可以看到确实是服务器上得资源:
(真棒!)
所以中文文件下载方式要先通过URLEncoder进行编码后再写入相应对象中。
下面一个案例来讲述用HttpServletResponse响应对象来向客户端输出随机图片(可以用作验证码)。
通常使用BufferedImage类来创建缓存图片对象,然后通过该对象创建图片对象Graphics2D对象,用图片对象进行文字和边框的设定等等之后,由ImageIO对象来负责将图片对象通过IO流传递给HttpServletResponse对象。
(未完待续。。。)
Servlet的学习之Response响应对象(2)的更多相关文章
- Servlet的学习之Response响应对象(3)
本篇来说明响应对象HttpServletResponse对象的最后一点内容. 首先来看响应对象控制浏览器定时刷新,在我的web应用[myservlet]中创建Servlet,在该Servlet中设置响 ...
- Servlet的学习之Response响应对象(1)
在之前学习了Servlet中的主体结构,包括Servlet的生命周期方法,和非生命周期方法能获取的一些非常重要的对象如ServletConfig.ServletContext对象等,而从这篇开始我们将 ...
- Servlet的学习之Request请求对象(3)
本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...
- Servlet的学习之Request请求对象(2)
在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...
- Django视图函数之request请求与response响应对象
官方文档: https://docs.djangoproject.com/en/1.11/ref/request-response/ 视图中的request请求对象: 当请求页面时,Django创建一 ...
- Servlet的学习之Request请求对象(1)
在本篇中开始对Servlet中的HttpServletRequest请求对象进行学习,请求对象同响应对象一样,我们可以根据该对象中的方法获取例如请求行,请求头和请求实体数据的方法. 在本篇中先对Htt ...
- flask基础之Response响应对象(九)
前言 Response对象负责对客户端的响应,每一个请求都会有一个Response对象,那么它在一个请求的声明周期内是怎么发挥作用的呢? Response对象 响应发生的位置 先回顾一下http请求的 ...
- Response响应对象
1.HttpServletResponse HttpServletResponse是一个定义在Servlet API中的接口,继承自ServletReponse接口,用于封装HTTP响应消息.HTTP ...
- django 获取request请求对象及response响应对象中的各种属性值
django request对象和HttpResponse对象 HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外) HttpRequest.scheme 请求方案 ...
随机推荐
- BZOJ 1216: [HNOI2003]操作系统( 优先队列 )
按题意用priority_queue模拟即可 ---------------------------------------------------------------------- #inclu ...
- 利用phpmailer类邮件发送
<?php require("class.phpmailer.php"); //下载的文件必须放在该文件所在目录 $mail = new PHPMailer(); //建立邮 ...
- 分享,iOS国家手机区号代码.plist
APP注册需要手机号码的时候,如果有在其他国家的时候需要填写手机区号 一份有国家名字和区号的plist 参照微信注册的时候 格式是 <Array> <Array> <Ar ...
- Qt 5.x 全局热键 for windows
Qt 升级到5.x版本后,QAbstractEventDispatcher中函数发生变动,导致libqxt库中的qxtGlobalShortcut挂掉.参考qxtGlobalShortcut写了一个全 ...
- python IDE ulipad配置使用
一直认为认为python自带的编辑器idle实在是太简陋了,连显示行号的功能都没有,也非常不好编辑.找了下windows平台下的Ide,发现ulipad很多人推荐使用,就开始安装了. 首先去官网: h ...
- Windows Azure 网站开发Stacks支持
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Daria Grigoriu 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. Windows Azure 网 ...
- jsp页面中格式化为小数点两位
<td align="center"> <% String avgnum = ""; if(request.getAttribute(&qu ...
- GPSR协议移植
修改的文件有packet.h.cmu-trace.cc.priqueue.cc.ns-packet.tcl.Makefile 1.在 $HOME/ns-allinone-2.29/ns-2.29下新建 ...
- 基于visual Studio2013解决C语言竞赛题之0906文件插入
题目
- asp.net后台对前台脚本的调用
后台像前台输出要执行的脚本 Response.Write("<script>alert('内容')</script>"); asp.net后台调用前台js脚 ...