A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 丶笑笑 初级黑马   /  2018-5-21 20:44  /  833 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

** Content-Disposition
        Content-disposition 是 MIME 协议的扩展,MIME 协议指示 MIME 用户代理如何显示附加的文件。
        当浏览器接收到头时,它会激活文件下载对话框,它的文件名框自动填充了头中指定的文件名。
        (请注意,这是设计导致的;无法使用此功能将文档保存到用户的计算机上,而不向用户询问保存位置。)
       
        设置这个头的目的是为了不让浏览器直接显示内容,而是直接弹出一个文件下载的对话框,设置要下载的文件名和原始文件名同名
        response.setHeader("Content-Disposition", "attachment;filename="+filename);

** 文件乱码的解决方案
        1、request请求中文乱码的解决
                ** Get方式
                        第一种(不推荐使用)
                                修改服务器的配置文件,找到服务器的配置文件server.xml在
                                        <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />  
                                里面加入URIEncoding属性,值为UTF-8                               
                        第二种(推荐使用)
                                String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8")                               
                ** Post方式
                        设置服务器端的解码方式
                                request.setCharacterEncoding("UTF-8");
       
        2、response响应解决中文乱码问题
                ** 字符流问题(俩种解决方案)
                        第一种
                                a、设置response的字符流编码为UTF-8
                                        **response.setCharacterEncoding("UTF-8")
                                b、设置浏览器解码用UTF-8的码表来解码
                                        **response.setHeader("conttent-type","text/html;charset=UTF-8")
                        第二种
                                相当于第一种方式的简单写法
                                response.setContentType("text/html;charset=UTF-8")
                               
                ** 字节流问题
                                a,对字符进行编码的时候,指定编码方式。其代码为:
                                        **response.getOutputStream().write("北京".getBytes("UTF-8"));
                                b,同时设置浏览器的解码方式。其代码为:
                                        **response.setHeader("content-type", "text/html;charset=UTF-8");或response.setContentType("text/html;charset=UTF-8");
        3、文件下载时中文名乱码
                ** 不包含中文名的文件下载
                        只需设置俩个头和一个流即可,详细代码演示如下
                                // 没有中文文件名的文件下载
                        private void test1(HttpServletRequest request, HttpServletResponse response)
                                throws FileNotFoundException, IOException {
                                // 1接受参数
                                String filename = request.getParameter("filename");
                                // 2完成文件下载
                        **// 2.1设置Content-Type头
                                String type = this.getServletContext().getMimeType(filename);
                                response.setHeader("Content-Type", type);
                        **// 2.2设置Content-Disposition头
                                response.setHeader("Content-Disposition", "attachment;filename=" + filename);
                                // 2.3设置文件的InputStream.
                                // 获取文件的绝对路径
                                String realPath = this.getServletContext().getRealPath("/demo4-skip/" + filename);
                                // 根据文件的绝对路径获取输入流对象
                                InputStream is = new FileInputStream(realPath);
                                // 获取输入流对象
                        **OutputStream os = response.getOutputStream();
                                // 下载文件
                                int len;
                                byte[] bys = new byte[1024];
                                while ((len = is.read(bys)) != -1) {
                                        os.write(bys, 0, len);
                                }
                                is.close();
                        }
                ** 包含中文文件名的文件下载
                        不仅需要设置俩个头和一个流,还需要根据浏览器的类型进行不同的编码,详细代码如下
                                // 中文文件名的下载
                                private void test2(HttpServletRequest request, HttpServletResponse response)
                                                throws FileNotFoundException, IOException {
                                        // 1接受参数
                                **String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"), "UTF-8");
                                        System.out.println(filename);
                                        // 2完成文件下载
                                        // 2.1设置Content-Type头
                                        String type = this.getServletContext().getMimeType(filename);
                                **response.setHeader("Content-Type", type);
                                        System.out.println(type);
                                        // 2.3设置文件的InputStream.
                                        // 获取文件的绝对路径
                                        String realPath = this.getServletContext().getRealPath("/demo4-skip/" + filename);
                                        System.out.println(realPath);
                                        // 根据浏览器类型处理中文文件乱码问题
                                        String agent = request.getHeader("User-Agent");
                                        System.out.println(agent);
                                        System.out.println(agent);
                                        if (agent.contains("Firefox")) {
                                                filename = base64EncodeFileName(filename);
                                        } else {
                                                filename = URLEncoder.encode(filename, "UTF-8");
                                        }

                                        // 2.2设置Content-Disposition头
                                **response.setHeader("Content-Disposition", "attachment;filename=" + filename);
                                        // 根据文件的绝对路径获取输入流对象
                                        InputStream is = new FileInputStream(realPath);
                                        // 获取输入流对象
                                **OutputStream os = response.getOutputStream();
                                        // 下载文件
                                        int len;
                                        byte[] bys = new byte[1024];
                                        while ((len = is.read(bys)) != -1) {
                                                os.write(bys, 0, len);
                                        }
                                        is.close();
                                }
                                //火狐浏览器的编码方式
                                public static String base64EncodeFileName(String fileName) {
                                        BASE64Encoder base64Encoder = new BASE64Encoder();
                                        try {
                                                return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("UTF-8"))) + "?=";
                                        } catch (UnsupportedEncodingException e) {
                                                e.printStackTrace();
                                                throw new RuntimeException(e);
                                        }
                                }
** 转发和重定向的区别
        1.转发的地址栏不变的.重定向的地址栏发生变化的.
        2.转发是一次请求一次响应,重定向是两次请求两次响应.
        3.request域对象存取的值在转发中是有效的,在重定向无效的.
        4.转发的路径不需要加工程名.重定向的路径需要加工程名.
** 使用BeanUtils封装数据
                JavaBean需要满足三个条件
                        a、无参构造器
                        b、private成员
                        c、public的get和set方法
                               
       

1 个回复

正序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马