zoukankan      html  css  js  c++  java
  • ssm下载文件

    ## 前台页面

    文件下载只需要在前端页面,(解决了中文文件名不能传输)
    跳到对应的controller, 参数跟上文件名fileName

    <a href="/ssm_kgc/fileDownload?fileName=宏宏.jpg">下载</a>


    ## 后台java代码

    /**
    * 文件下载,只需要传入对应文件名字
    */
    @RequestMapping("/fileDownload")
    public void fileDownload(
    @RequestParam(value = "fileName",required = false)String fileName,
    HttpServletRequest req,
    HttpServletResponse resp,
    HttpSession session) throws Exception {

    /*******************1.接收请求参数***********************************/
    //获取文件名,接收文件名参数

    /*******************2.对接收的参数进行编码处理**************************/
    /**因为使用的是UTF-8的编码形式,所以不需要进行转码**/
    //获取参数 ,默认会对参数进行编码 ISO8859-1
    //把乱码转回二进制位
    // byte[] bytes = name.getBytes("ISO8859-1");
    //再去使用UTF-8进行编码
    // name = new String(name.getBytes(),"UTF-8");

    /*******************3.告诉浏览器响应的文件的类型*************************/
    // 根据文件名来获取mime类型
    String mimeType = session.getServletContext().getMimeType(fileName);
    // 设置 mimeType
    resp.setContentType(mimeType);

    /*******************4.告诉浏览器以附件的形式下载*************************/
    // 获取客户端信息
    String agent = req.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");
    }
    // 告诉浏览器是以附件形式来下载 不要解析
    resp.setHeader("Content-Disposition", "attachment;filename=" + filenameEncoder);

    /*******************5.输出对应的流*************************/
    //获取文件的绝对路径,拼接文件的路径
    String path = session.getServletContext().getRealPath("download/" + fileName);

    System.out.println("下载文件的路径" + path);
    //写入流中
    FileInputStream is = new FileInputStream(path);
    //获取相应的输出流
    ServletOutputStream os = resp.getOutputStream();
    byte[] b = new byte[1024];
    int len;
    //写入浏览器中
    while((len = is.read(b)) != -1){
    os.write(b, 0, len);
    }
    //关闭对应的流
    os.close();
    is.close();
    }

  • 相关阅读:
    Linux命令备忘录: jobs 显示Linux中的任务列表及任务状态命令
    解决软件启动报error while loading shared libraries: libgd.so.2: cannot open shared object错误
    SSH远程登录和端口转发详解
    《PHP内核探索系列文章》系列分享专栏
    如何防止网页被植入广告,内容被监控-HTTPS
    深入分析PHP优化及注意事项
    php模拟登陆的两种实现方法分析
    PHP中实现MySQL嵌套事务的两种解决方案
    php+Mysqli利用事务处理转账问题实例
    Yaf零基础学习总结5-Yaf类的自动加载
  • 原文地址:https://www.cnblogs.com/xwd2366846227/p/11187993.html
Copyright © 2011-2022 走看看