码迷,mamicode.com
首页 > 其他好文 > 详细

Servlet的学习(八)

时间:2015-10-04 19:38:16      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

  本篇接上一篇《Servlet的学习(七)》,继续从HttpServletResponse响应对象来介绍其方法和功能。

 

  使用setHeader方法结合HTTP协议的content-disposition响应头可以将某些web资源以下载方式回传给客户端。但是在下载中文文件的时候会有一些问题,这问题会怎么发生呢?

  我们现在来进行从客户端向服务器端下载一个图片文件,先在MyEclipse的自创建【myservlet】web工程下准备一个图片文件,放置在web目录下的【download】文件夹中:

  技术分享

创建名为ServletResponse的Servlet,代码如下:

 1 public void doGet(HttpServletRequest request, HttpServletResponse response)
 2             throws ServletException, IOException {
 3 
 4         //1,获取将要下载的文件路径和文件名
 5         ServletContext context = this.getServletContext();
 6         String filePath = context.getRealPath("/download/银魂全家福.jpg");
 7         String fileName = filePath.substring(filePath.lastIndexOf("\\")+1);
 8         
 9         //2,使用HTTP协议的Content-Disposition请求头告诉客户端以下载方式接受这个数据(文件)
10         response.setHeader("content-disposition", "attachment;filename="+fileName);
11         
12         //3,通过流向响应对象写数据实体,然后由响应对象提交给客户端    
13         FileInputStream fis = null;
14         try{
15             OutputStream out = response.getOutputStream();
16             fis = new FileInputStream(filePath);
17             byte[] buff = new byte[1024];
18             int len = 0;
19             while((len =fis.read(buff))>0) {
20                 out.write(buff, 0, len);
21             }
22         }
23         finally {
24             if(fis!=null) {
25                 fis.close();
26             }
27         }
28     }

而这样,当在浏览器中访问该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的学习(八)

标签:

原文地址:http://www.cnblogs.com/fjdingsd/p/4854843.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!