本篇接上一篇《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)的更多相关文章

  1. Servlet的学习之Response响应对象(3)

    本篇来说明响应对象HttpServletResponse对象的最后一点内容. 首先来看响应对象控制浏览器定时刷新,在我的web应用[myservlet]中创建Servlet,在该Servlet中设置响 ...

  2. Servlet的学习之Response响应对象(1)

    在之前学习了Servlet中的主体结构,包括Servlet的生命周期方法,和非生命周期方法能获取的一些非常重要的对象如ServletConfig.ServletContext对象等,而从这篇开始我们将 ...

  3. Servlet的学习之Request请求对象(3)

    本篇接上一篇,将Servlet中的HttpServletRequest对象获取RequestDispatcher对象后能进行的[转发]forward功能和[包含]include功能介绍完. 首先来看R ...

  4. Servlet的学习之Request请求对象(2)

    在上一篇<Servlet的学习(十)>中介绍了HttpServletRequest请求对象的一些常用方法,而从这篇起开始介绍和学习HttpServletRequest的常用功能. 使用Ht ...

  5. Django视图函数之request请求与response响应对象

    官方文档: https://docs.djangoproject.com/en/1.11/ref/request-response/ 视图中的request请求对象: 当请求页面时,Django创建一 ...

  6. Servlet的学习之Request请求对象(1)

    在本篇中开始对Servlet中的HttpServletRequest请求对象进行学习,请求对象同响应对象一样,我们可以根据该对象中的方法获取例如请求行,请求头和请求实体数据的方法. 在本篇中先对Htt ...

  7. flask基础之Response响应对象(九)

    前言 Response对象负责对客户端的响应,每一个请求都会有一个Response对象,那么它在一个请求的声明周期内是怎么发挥作用的呢? Response对象 响应发生的位置 先回顾一下http请求的 ...

  8. Response响应对象

    1.HttpServletResponse HttpServletResponse是一个定义在Servlet API中的接口,继承自ServletReponse接口,用于封装HTTP响应消息.HTTP ...

  9. django 获取request请求对象及response响应对象中的各种属性值

    django request对象和HttpResponse对象 HttpRequest对象(除非特殊说明,所有属性都是只读,session属性是个例外) HttpRequest.scheme 请求方案 ...

随机推荐

  1. Fundamental types

    Fundamental types void type boolean type character types integer types Modifiers signedness size Pro ...

  2. ECSHOP常用函数

    lib_time.php gmtime() #获得当前格林威治时间的时间戳 /$0 server_timezone() #获得服务器的时区 /$0 local_mktime($hour = NULL ...

  3. 在springmvc中controller的一个方法处理多个不同请求

    value的uri值为以下三类: A) 可以指定为普通的具体值: B)  可以指定为含有某变量的一类值(URI Template Patterns with Path Variables): @Req ...

  4. 基于visual Studio2013解决C语言竞赛题之0509杨辉三角

     题目

  5. C语言实现单链表的逆置

          单链表的逆置是一个非常经典的问题,这里利用两个思想进行解决.       首先,我们需要看下原理图,其实两个思想都是一样的,都是使后一个的节点的 next 指针指向前一个节点,依次递推,直 ...

  6. eclipse中build workspace的相关优化

    网上流传的各种的eclipse的调优的方法都大同小异,但是调优的基本上针对eclipse或者myclipse的本身,比如关掉validate和启动项,文件拼写,和自动构建等,调过之后,等个eclips ...

  7. Android 实现在线程中联网

    其实我们要牢记的是,对数据流的操作都是阻塞的,在一般情况下,我们是不需要考虑这个问题的,但是在Android 实现联网的时候,我们必须考虑到这个问题.比如:从网络上下载一张图片: Java代码: pu ...

  8. Linux下tcpdump用法

    根据使用者的定义对网络上的数据包进行截获的包分析工具.tcpdump将网络中传送的数据包的“头”完全截获下来提供分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供了and. or.not等逻 ...

  9. PHP - Cookie 应用

    效果: 代码: <?php //设置编码 header("content-type:text/html; charset=utf-8"); //接收提交的数据 //判断是否接 ...

  10. Android Mediaplayer 调用release()的时候ANR

    先stop,然后再release,最后吧media置为null