本篇接上一篇《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对象。
(未完待续。。。)