文件下载

文件下载
本质就是将一台电脑(服务器)中的文件根据网络协议通过io流传递到另外一台电脑上。
文件下载两种形式

  1. 超链接如果浏览器支持这个格式的文件.可以在浏览器中打开.如果浏览器不支持这个格式的文 件才会提示下载.
  2. 手动编写代码的方式下载

手动编写代码实现下载
1. 设置媒体类型
2. 设置下载窗口
3. 开始读写

代码实现:

@WebServlet(name = "DownLoadServlet",urlPatterns = "/download")
public class DownLoadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    doPost(req, resp);
}

public String base64EncodeFileName(String fileName) {
    BASE64Encoder base64Encoder = new BASE64Encoder();
    try {
        return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("utf-8"))) + "?=";
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 文件下载:将服务器中的文件拷贝到本地电脑中
    String fileName = req.getParameter("fileName");
    String userAgent = req.getHeader("User‐Agent");
    String newFileName = null;

    if ("Chrome".equals(userAgent)) {
        newFileName = URLEncoder.encode(fileName, "utf-8");
    } else {
        newFileName = base64EncodeFileName(fileName);
    }

    String mimeType = req.getServletContext().getMimeType(fileName);
    resp.setContentType(mimeType);

    resp.setHeader("Content-Disposition", "attachement;filename=" + newFileName);

    String inPath = req.getServletContext().getRealPath("upload") + File.separator + fileName;
    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inPath));
    ServletOutputStream outputStream = resp.getOutputStream();
    BufferedOutputStream bos = new BufferedOutputStream(outputStream);

    int len = -1;
    byte[] bys = new byte[8192];
    while ((len = bis.read(bys)) != -1) {
        bos.write(bys, 0, len);
    }

    bis.close();
    bos.close();
}
}

解决下载文件名中文乱码问题
因为每个浏览器的不同内核到导致文件下载编码不同所以要解决文件名乱码

String userAgent = req.getHeader("User‐Agent");
    String newFileName = null;

    if ("Chrome".equals(userAgent)) {
    //	谷歌浏览器
        newFileName = URLEncoder.encode(fileName, "utf-8");
    } else {
        newFileName = base64EncodeFileName(fileName);
    }
    public String base64EncodeFileName(String fileName) {
    BASE64Encoder base64Encoder = new BASE64Encoder();
    try {
        return "=?UTF-8?B?" + new String(base64Encoder.encode(fileName.getBytes("utf-8"))) + "?=";
    } catch (Exception e) {
        e.printStackTrace();
        throw new RuntimeException(e);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值