//接收参数并解决乱码
        String filename = new String(request.getParameter("filename").getBytes("iso-8859-1"),"utf-8");
        //根据文件名称得到mime类型
        String mimeType = this.getServletContext().getMimeType(filename);
        response.setHeader("Content-Type", mimeType);
        //获取浏览器相关信息
        String agent = request.getHeader("User-Agent");
        //判断是什么浏览器,根据不同浏览器解码
        /*
         * 不同浏览器下载中文文件时解析文件编码不同,Firefox浏览器下载中文文件名的时候采用的是Base64的字符编码解码文件名.
         * 文件名是通过Content-Disposition消息带过去的,所以需要提前转换成URL或者Base64的编码后字符。过去才可以正常解码;
         */
        if(agent.contains("Firefox")){
            filename = base64EncodeFileName(filename);
        }else{
            filename = URLEncoder.encode(filename,"UTF-8");
        }
        //Content-Disposition该响应头告诉浏览器以什么方式处理,attachment值告诉以附件形式下载,filename值为附件显示名称。
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        InputStream is = this.getServletContext().getResourceAsStream("/download/中文文件.rmvb");
        ServletOutputStream os = response.getOutputStream();
        int len = 0;
        byte[] a = new byte[1024];
        while ((len=is.read(a)) != -1) {
            os.write(a,0,len);
        }
        is.close();
        os.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.超链接下载,直接将文件路径写如href中(文件类型如果浏览器不支持会下载,如果支持会直接显示)
2.超链接下载,手动编写代码的方式完成文件下载
Content-Type :文件的MIME类型
Content-Disposition:以下载的形式打开文件
InputStream:文件的输入流

posted on 2018-07-31 11:34  zeronexyz  阅读(212)  评论(0编辑  收藏  举报