JavaWeb(Servlet/JSP)实现文件下载

文件下载

  • 通过IDEA编写
  • 通过JavaWeb(JSP)实现文件下载
  • 使用的是Maven导包

一、通过后端下载

/**
 * 作者:沈公子
 * 日期:2022/7/15 - 12:29
 * 作用:文件下载 Servlet
 * 需求:
 */
 @WebServlet(name = "FileServlet", value = "/FileServlet")
public class FileDownloadServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1、要获取下载文件的路径,需要下载的路径,resources 目录中需要有这个文件,才可以下载
		//  String realPath = "E:\\Java\\JavaDemo\\JavaWeb\\demo05_1\\target\\classes\\1.png";    // 需要先编译
        String realPath = "E:\\Java\\JavaDemo\\JavaWeb\\demo05_1\\src\\main\\resources\\1.png";
       // String realPath = "E:\\NativeFile\\Pictures\\测试\\1.png"; 
        System.out.println("下载文件的路径:" + realPath);
        // 2、下载的文件名是啥
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        // 3、设置想办法让浏览器能够支持下载我们需要的东西,字符串单词固定,中文文件名转码,否则乱码(固定)
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        // 4、获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        // 5、创建缓冲区
        byte[] buffer = new byte[1024];
        // 6、判断释放读取完毕
        int len = 0;
        // 7、获取OutputStream对象
        ServletOutputStream out = resp.getOutputStream();
        // 8、将 FileOutputStream 流写入到buffer缓冲区,使用OutputStream缓冲区中的数据输出到客户端
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        
	// 不需要关闭流,随着响应结束,response对象销毁,由服务器关闭
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

二、前端和后端交互下载

前端代码

  <a href="http://localhost:8080/demo05_1_war/DownloadServlet?filename=1.png">
        文件下载
    </a>

后端代码

@WebServlet(name = "DownloadServlet", value = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        // 获取要下载的文件名称
        String filename = request.getParameter("filename");
        // 下载文件所在目录,在 webapp 下创建该目录 download,并放置要下载的内容
        String folder = "/download/";
        // 通知浏览器以下载的方式打开
        response.addHeader("Content-Type", "application/octet-stream");
        response.setHeader("Content-Disposition", "attachment;filename=" + filename);
        // 通过文件流读取文件
        InputStream in = getServletContext().getResourceAsStream(folder + filename);
        OutputStream out = response.getOutputStream();
        /*byte[] buffer = new byte[1024];
        int len;
        // 循环输出流中的数据
        while ((len=in.read(buffer)) != -1){
            out.write(buffer,0,len);
        }*/
        
        
        /*
           <!--io流读取-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        */
        // 使用工具栏,实现流的copy
        IOUtils.copy(in,out);
		// 不需要关闭流,随着响应结束,response对象销毁,由服务器关闭
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值