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();
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卧虎3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值