• 图片文件下载


    文件下载需求

    1. 在页面中显示超链接
    2. 点击超链接后弹出下载提示框。
    3. 完成图片文件下载。

    分析

    步骤:

    1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename
    2. 定义Servlet
        1. 获取文件名称。
        2. 使用字节输入流加载文件进内存。
        3. 指定response的响应头: content-disposition:attachment;filename=xxx
        4. 将数据写出到response输出流。

    download.html

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>文件下载</title>
        </head>
        <body>
            <a href="/response/downLoadServlet?filename=九尾.jpg">图片下载</a>
            <a href="/response/downLoadServlet?filename=1.mp4">视频下载</a>
    
        </body>
    </html>
    

    DownLoadServlet.java

    @WebServlet("/downLoadServlet")
    public class DownLoadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //1.获取请求参数,文件名称
            String filename = request.getParameter("filename");
            
            //2.使用字节输入流加载文件进内存
            //2.1找到文件服务器路径
            ServletContext servletContext = this.getServletContext();
            String realPath = servletContext.getRealPath("/image/" + filename);
            //2.2用字节流关联
            FileInputStream fis = new FileInputStream(realPath);
    
            //3.设置response的响应头
            //3.1设置响应头类型:content-type
            String mimeType = servletContext.getMimeType(filename);//获取文件的mime类型
            response.setHeader("content-type", mimeType);
            //3.2设置响应头打开方式:content-disposition
    
            response.setHeader("content-disposition", "attachment;filename=" + filename);
    
            //4.将输入流的数据写出到输出文件中
            ServletOutputStream sos = response.getOutputStream();
            byte[] buff = new byte[1024 * 8];
            int len = 0;
            while ((len = fis.read(buff)) != -1) {
                sos.write(buff, 0, len);
            }
            fis.close();
        }
        
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    效果展示

    解决中文文件名无法显示问题

    1. 获取客户端使用的浏览器版本信息
    2. 根据不同的版本信息,设置filename的编码方式不同

    使用DownLoadUtils.java

    public class DownLoadUtils {
        public static String getFileName(String agent, String filename) throws UnsupportedEncodingException {
            if (agent.contains("MSIE")) {
                // IE浏览器
                filename = URLEncoder.encode(filename, "utf-8");
                filename = filename.replace("+", " ");
            } else if (agent.contains("Firefox")) {
                // 火狐浏览器
                BASE64Encoder base64Encoder = new BASE64Encoder();
                filename = "=?utf-8?B?" + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
            } else {
                // 其它浏览器
                filename = URLEncoder.encode(filename, "utf-8");
            }
            return filename;
        }
    }
    

    修改DownLoadServlet.java

    @WebServlet("/downLoadServlet")
    public class DownLoadServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
            //1.获取请求参数,文件名称
            String filename = request.getParameter("filename");
    
            //2.使用字节输入流加载文件进内存
            //2.1找到文件服务器路径
            ServletContext servletContext = this.getServletContext();
            String realPath = servletContext.getRealPath("/image/" + filename);
            //2.2用字节流关联
            FileInputStream fis = new FileInputStream(realPath);
    
            //3.设置response的响应头
            //3.1设置响应头类型:content-type
            String mimeType = servletContext.getMimeType(filename);//获取文件的mime类型
            response.setHeader("content-type", mimeType);
            //3.2设置响应头打开方式:content-disposition
    
            //解决中文文件名问题
            //1.获取user-agent请求头、
            String agent = request.getHeader("user-agent");
            //2.使用工具类方法编码文件名即可
            filename = DownLoadUtils.getFileName(agent, filename);
    
            response.setHeader("content-disposition", "attachment;filename=" + filename);
    
            //4.将输入流的数据写出到输出文件中
            ServletOutputStream sos = response.getOutputStream();
            byte[] buff = new byte[1024 * 8];
            int len = 0;
            while ((len = fis.read(buff)) != -1) {
                sos.write(buff, 0, len);
            }
            fis.close();
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    解决中文文件名无法显示问题后效果展示

  • 相关阅读:
    利用余数选择特殊位置元素
    CSS hack
    css选择器
    按yyyy-mm-dd格式输入一个日期,判断这是这一年的第几天
    输入不同year,month,打印月历
    java学习之多线程(二)
    java学习之多线程
    剑指offer--第一个只出现一次的字符
    剑指offer--两个链表的第一个公共结点
    剑指offer--最小的k个数
  • 原文地址:https://www.cnblogs.com/gujun1998/p/11355740.html
Copyright © 2020-2023  润新知