文件下载

Posted laodang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文件下载相关的知识,希望对你有一定的参考价值。

//接收参数并解决乱码
        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);
        }
    }

 

以上是关于文件下载的主要内容,如果未能解决你的问题,请参考以下文章

在Tomcat的安装目录下conf目录下的server.xml文件中增加一个xml代码片段,该代码片段中每个属性的含义与用途

代码片段 PHP,预期文件结尾,我错在哪里?

代码适用于与单个 html 文件不同的堆栈片段

VS code自定义用户代码片段snippet

Java itext为pdf 文件添加水印核心功能代码片段

VSCode自定义代码片段——声明函数