• 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对象。

    (未完待续。。。)

  • 相关阅读:
    vue自定义svg图标无法显示
    生成海报图
    ICS 文件的生成及下载
    Apache中模块 mod_rewrite的使用示例
    小议数据框架的封装
    TianvCMS部分官方插件
    分享T4代码生成及源码(sqlite版),欢迎新手参考、修改(无版权)
    使用 SaToken 解决 WebSocket 握手身份认证
    Element Plus 正式版发布啦!🎉🎉
    mysql锁表问题
  • 原文地址:https://www.cnblogs.com/fjdingsd/p/4854843.html
Copyright © 2020-2023  润新知