zoukankan      html  css  js  c++  java
  • Servlet的学习之Response响应对象(2)

      本篇接上一篇《Servlet的学习之Response响应对象(1)》,继续从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对象。

    (未完待续。。。)

  • 相关阅读:
    【Todo】Java线程面试题 Top 50 (转载)
    【Todo】秒杀系统 & 乐观锁 & Nginx反向代理
    【Todo】C++和Java里面的浮点数及各种数字表示
    asp.net操作word的表格
    Android消息推送(二)--基于MQTT协议实现的推送功能
    单点更新线段树 RMQ
    英语月结
    AppWidget应用(二)---PendingIntent 之 getActivity
    2 WAN 和1 Evo/3g Routeros PCC 方法负载平衡
    Android 网络权限配置
  • 原文地址:https://www.cnblogs.com/fjdingsd/p/4854843.html
Copyright © 2011-2022 走看看