Servlet实现文件下载

项目结构
在这里插入图片描述
代码;

/**
 * @program: Servlet
 * @description:Servlet 实现文件下载
 * @author: stone
 * @create: 2021-04-24 20:05
 **/
public class DownloadServlet extends HttpServlet {

    /*
    步骤:
    * 1.获取要下载的文件名
    * 2.通过响应头告诉客户端返回的数据类型
    * 3.通过响应头告诉客户端收到的数据是于下载使用
    * 4.读取要下载的文件内容
    * 5.把下载的文件内容传回客户端
    * */

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        要下载的文件名
        String downloadFileName = "study.jpg";
//        获取ServletContext对象
        ServletContext servletContext = getServletContext();
//        获取下载的文件类型
        String mimeType = servletContext.getMimeType("/file/" + downloadFileName);
//        告诉客户端返回的数据类型
        resp.setContentType(mimeType);
//        告诉客户端收到的数据用于下载使用(通过响应头)
//        Content-Disposition 响应头,表示收到的数据怎么处理
//        attachment 附件,表示下载使用
//        filename=  表示指定下载的文件名,不一定和原文件名一样,可以改名,但是默认不支持中文,需要根据不同的浏览器做编码转换
        if (req.getHeader("User-Agent").contains("Firefox")) {
            // 如果是火狐浏览器使用Base64编码
            resp.setHeader("Content-Disposition", "attachment; filename==?UTF-8?B?" + new BASE64Encoder().encode("好好学习.jpg".getBytes("UTF-8")) + "?=");
        } else {
            // 如果不是火狐,是IE或谷歌,使用URL编码操作
            resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode("好好学习.jpg", "UTF-8"));
        }
//        第一个'/'被服务器解析表示地址为http://ip:port/工程名/   映射到代码的web目录
        InputStream resourceAsStream = servletContext.getResourceAsStream("/file/" + downloadFileName);
//        获取响应的输出流
        ServletOutputStream outputStream = resp.getOutputStream();
//        读取输入流中全部的数据,复制给输出流,输出给客户端
        IOUtils.copy(resourceAsStream, outputStream);

    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

鑫宇_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值