zoukankan      html  css  js  c++  java
  • JavaWeb——HttpServletResponse的使用,文件下载

    HTTPServletRespons

    我们在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。

    service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。

    TomCat下Servlet的请求和响应流程

    设置HTTP响应

    因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响 应头和响应体

    一、设置响应行

    response.setStatus(404);  // 设置响应状态码

    示例:设置重定向

    response.sendRedirect("http://www.baidu.com");

    实际上执行的是下面的两行代码

    response.setStatus(302);  // 设置302响应码
    response.setHeader("Location","http://www.baidu.com")  // 设置响应头,重定向
     1 <!DOCTYPE html>
     2 <html>
     3 <head>
     4 <meta charset="UTF-8">
     5 <title>Insert title here</title>
     6 </head>
     7 <body>
     8     恭喜你,注册成功,<span style="color:red" id="second">5</span>秒钟后跳转,如不跳转点击<a href="http://www.baidu.com">这里</a>!.
     9     <script type="text/javascript">
    10         window.onload = function(){        <!--页面加载后执行-->
    11             var time = 5;
    12             var secondEle = document.getElementById("second");
    13             var timer = setInterval(function(){
    14                 secondEle.innerHTML = time;
    15                 time--;
    16                 if(time==0){
    17                     clearInterval(timer);    <!--清除定时器-->
    18                     location.href="http://www.baidu.com";    <!--页面跳转-->
    19                 }
    20                 
    21             },1000);    <!--定时器-->
    22         }
    23 
    24 
    25     <!--定时器格式:  setInterval(每过指定的毫秒值,执行的函数)(毫秒值)-->
    26     </script>
    27 </body>
    28 </html>
    JS版跳转页面

    二、设置响应头

    response.setHeader(Key,Value)

    示例:

    response.setHeader("refresh","5;url=http://www.baidu.com");  // 设置页面加载后5s跳转到指定url

    三、设置响应体

    1)返回文本数据

    response.getWriter().write("你好,world.");

    中文乱码问题

    原因:在服务器端有一个Response缓冲区,当我们书写 "你好,world." 的时候,会查询ISO-8859-1编码表将其转换成字节形式,但此编码表中没有中文,所以返回的就是一堆?。

    解决办法:

    response.setCharacterEncoding("UTF-8");  // 设置缓冲区的编码集为UTF-8格式
    response.setHeader("Content-Type","text/html; charset=utf-8");  // 设置响应头为utf-8格式

    简便模式
    response.setContentType("text/html; charset=utf-8");

    2)返回字节型(图片等)数据

    OutputStream out = response.getOutputStream();      // 字节输出流

    示例:传图片文件

    String real_path = super.getServletContext().getRealPath("a.png");   // 获取文件的绝对路径
    InputStream in = new FileInputStream(real_path);        // 字节输入流
    
    OutputStream out = response.getOutputStream();      // 字节输出流
    
    
    byte[] b = new byte[1024];    // 初始化字节数组
    int len = 0;
    while((len=in.read(b))!=-1){
        out.write(b,0,len);  // 写
    }
    
    in.close();    // 关闭字节输出流
    out.close();    // 这个可以不用写,TomCat会帮我们关的
    

    示例:文件下载案例

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名称
        String filename = request.getParameter("filename");
    
        // 设置下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
        response.setContentType(this.getServletContext().getMimeType(filename));
        // 设置请求头,告诉客户端该文件不是直接解析,而是以附件形式打开(下载)
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
    
        // 获取文件的绝对路径
        String path = super.getServletContext().getRealPath("download/"+filename);
        // 实例化文件输入流
        InputStream in = new FileInputStream(path);
        // 获取文件输出流
        OutputStream out = response.getOutputStream();
    
        // 实例化字节数组
        byte[] b = new byte[1024];
        int len = 0;
        while ( (len=in.read(b))!=-1 ){
            out.write(b,0,len);
        }
    
        in.close();     // 关闭输入流
    
    }

    但这样会发现,下载中文名称的文件,下载的文件没有名字,所以我们要根据不同的浏览器对其修改编码

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取要下载的文件名称
        String filename = request.getParameter("filename");
    
        //如果中文有问题的话,使用下面的代码,修改编码格式
        //filename = new String(filename.getBytes("ISO8859-1"),"UTF-8");
    
        //======================= 根据浏览器的不同,进行不同的编码 =======================
    
        //获得请求头中的User-Agent
        String agent = request.getHeader("User-Agent");
        //根据不同浏览器进行不同的编码
        String filenameEncoder = "";
        if (agent.contains("MSIE")) {
            // IE浏览器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
            filenameEncoder = filenameEncoder.replace("+", " ");
        }  else if (agent.contains("Firefox")) {
            // 火狐浏览器
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filenameEncoder = "=?utf-8?B?"
                    + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
        } else {
            // 其它浏览器
            filenameEncoder = URLEncoder.encode(filename, "utf-8");
        }
    
    
        // 设置下载的这个文件的类型-----客户端通过文件的MIME类型去区分类型
        response.setContentType(this.getServletContext().getMimeType(filename));
        // 设置请求头,告诉客户端该文件不是直接解析,而是以附件形式打开(下载)================== 设置响应头的文件名为编码后的名字
        response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
    
        // 获取文件的绝对路径
        String path = super.getServletContext().getRealPath("download/"+filename);
        // 实例化文件输入流
        InputStream in = new FileInputStream(path);
        // 获取文件输出流
        OutputStream out = response.getOutputStream();
    
        // 实例化字节数组
        byte[] b = new byte[1024];
        int len = 0;
        while ( (len=in.read(b))!=-1 ){
            out.write(b,0,len);
        }
    
        in.close();     // 关闭输入流
    
    }
    
  • 相关阅读:
    学习进度03
    构建之法阅读笔记03
    软件工程结队作业01
    用图像算法增强夜视效果
    python将指定目录下的所有文件夹用随机数重命名
    python脚本中调用其他脚本
    opencv+python实现图像锐化
    机器学习中减弱不同图像数据色调及颜色深浅差异
    python利用列表文件遍历
    python文件处理-检查文件名/路径是否正确
  • 原文地址:https://www.cnblogs.com/x54256/p/8449488.html
Copyright © 2011-2022 走看看