java web实现文件下载

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fengj04/article/details/79705711

javaweb实现文件下载

  • 实现文件下载
  • 解决下载文件名带有中文乱码问题

效果图

这里写图片描述

这里写图片描述

实现思路

根据请求连接获取文件名和文件类型,设置响应头,获取输入流和输出流

核心代码

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        String fileName = request.getParameter("fileName");
        //获得请求头中的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");             
        }
        //告诉浏览器解析文件的类型
        response.setContentType(this.getServletContext().getMimeType(fileName));
        //告诉浏览器不能解析文件且适配各种浏览器提供文件默认的名称
        response.setHeader("Content-Disposition", "attachment;filename="+fileNameEncoder); 
        String realPath = getServletContext().getRealPath(fileName);
        InputStream in = new FileInputStream(realPath);
        ServletOutputStream out = response.getOutputStream();
        int len = 0;
        byte[] bytes = new byte[1024];
        while ((len = in.read(bytes)) > 0)
        {
            out.write(bytes, 0, len);   
        }
        out.close();
        in.close();
    }

重点

  1. response.setHeader(“Content-Disposition”, “attachment;filename=”+fileNameEncoder); 实现强制下载
  2. response.setContentType(this.getServletContext().getMimeType(fileName)); 可以省略
  3. 解决文件名称乱码问题
    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”);
    }

猜你喜欢

转载自blog.csdn.net/Fengj04/article/details/79705711
今日推荐