简单实现Servlet文件下载功能

实现 Servlet 文件下载功能,需要经历以下几个步骤:

  1. 在 Web 项目的 WEB-INF 目录下创建 servlet-context.xml 配置文件,添加一条 Bean 标签用于初始化 Servlet 。
<bean id="fileDownloadServlet" class="com.example.controller.FileDownloadServlet" init-method="init"/>
  1. 创建一个 Servlet ,用于处理下载请求,并在 init 方法中初始化 Servlet 的相关配置。在 Servlet 中,需要获取要下载的文件路径及文件名称,以及设置 HttpServletResponse 对象相关的响应头信息。
public class FileDownloadServlet extends HttpServlet {
    private String filePath;
    private String fileName;

    @Override
    public void init() throws ServletException {
        ServletContext servletContext = getServletContext();
        filePath = servletContext.getRealPath("/WEB-INF/download/");
        fileName = "test.txt";
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("UTF-8");

        File file = new File(filePath + fileName);
        if (file.exists()) {
            response.setContentType("application/octet-stream"); 
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            ServletOutputStream outputStream = response.getOutputStream();
            InputStream in = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = in.read(buffer)) > 0) {
                outputStream.write(buffer, 0, len);
            }
            in.close();
        } else {
            response.getWriter().println("<h1>File not found.</h1>");
        }
    }
}
  1. 在 JSP 页面上添加一个超链接,用于向 Servlet 发送下载请求。例如:
<a href="downloadServlet">下载文件</a>
  1. 将下载文件放置在 Web 项目的 WEB-INF 目录下的 download 子目录中,例如:/WEB-INF/download/test.txt。

示例一:

我们在一个叫做 myspring 的 Java Web 项目中创建 ServletContext.xml 的配置文件,输入以下内容:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

    <bean id="fileDownloadServlet" class="com.example.controller.FileDownloadServlet" init-method="init"/>

</beans>

在 com/example/controller/ 路径下,创建一个 Java 类 FileDownloadServlet。

public class FileDownloadServlet extends HttpServlet {
    private String filePath;
    private String fileName;

    @Override
    public void init() throws ServletException {
        ServletContext servletContext = getServletContext();
        filePath = servletContext.getRealPath("/WEB-INF/download/");
        fileName = "test.txt";
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("UTF-8");

        File file = new File(filePath + fileName);
        if (file.exists()) {
            response.setContentType("application/octet-stream"); 
            response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
            ServletOutputStream outputStream = response.getOutputStream();
            InputStream in = new FileInputStream(file);
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = in.read(buffer)) > 0) {
                outputStream.write(buffer, 0, len);
            }
            in.close();
        } else {
            response.getWriter().println("<h1>File not found.</h1>");
        }
    }
}

在 web.xml 中,添加以下内容,将 /download 路径映射到 FileDownloadServlet 中。

<servlet>
    <servlet-name>downloadServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:META-INF/spring/servlet-context.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>downloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>

示例二:

我们在一个 Java Web 项目的 WebContent 文件夹下,新建一个路径为 WEB-INF/download/ 的文件夹,将要下载的文件放在该文件夹中,例如:文件名为 test.txt。

在 WebContent 文件夹下,新建文件 download.jsp 文件,输入以下内容:

<%@page contentType="text/html" pageEncoding="UTF-8"%>  
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="UTF-8">  
    <title>文件下载</title>  
</head>  
<body>  
    <h4><a href="./downloadServlet?fileName=test.txt">下载文件 test.txt</a></h4>  
</body>  
</html>

在 WebContent 下的 WEB-INF 文件夹下,创建 web.xml 文件,添加以下内容:

<servlet>   
    <servlet-name>download</servlet-name>   
    <servlet-class>com.example.controller.FileDownloadServlet</servlet-class>   
</servlet>   
<servlet-mapping>   
    <servlet-name>download</servlet-name>   
    <url-pattern>/downloadServlet</url-pattern>   
</servlet-mapping>

在 com/example/controller/ 路径下,创建一个 Java 类 FileDownloadServlet。

public class FileDownloadServlet extends HttpServlet {  
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {  
        //设置响应内容类型  
        response.setContentType("application/octet-stream");  

        String fileName = request.getParameter("fileName");  
        String filePath = request.getSession().getServletContext().getRealPath("/") + "download/" + fileName;  

        //设置响应头信息  
        response.setHeader("Content-Disposition", "attachment;fileName=\"" + fileName + "\"");  

        //读取要下载的文件,保存到文件输入流  
        FileInputStream inputStream = new FileInputStream(filePath);  

        //创建输出流  
        OutputStream outputStream = response.getOutputStream();  

        //创建缓冲区  
        byte[] buffer = new byte[1024];  
        int len = 0;  

        //循环将输入流中的内容读取到缓冲区当中  
        while ((len = inputStream.read(buffer)) > 0) {  
            //输出缓冲区的内容到浏览器,实现文件下载  
            outputStream.write(buffer, 0, len);  
        }  

        //关闭文件输入流和输出流  
        inputStream.close();  
        outputStream.close();  
    }  
} 

最后,在 Tomcat 中启动该 Web 项目,运行在本地端口,访问 download.jsp 页面即可下载 test.txt 文件。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:简单实现Servlet文件下载功能 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • 详解SpringBoot中异步请求和异步调用(看完这一篇就够了)

    下面我将为您详细讲解“详解SpringBoot中异步请求和异步调用(看完这一篇就够了)” 的完整攻略。 什么是异步请求和异步调用 在Web编程中,我们通常使用同步方式来处理客户端请求,即客户端向服务端发送请求后,服务端会一直等待直到完成响应,然后再返回响应结果。而异步方式则是一种非阻塞IO的处理模式,即客户端向服务端发送请求后,服务端不会立即返回响应结果,而…

    Java 2023年5月19日
    00
  • Spring Boot应用通过Docker发布部署的流程分析

    一、简介 Docker是一个著名的容器化技术,可以帮助开发团队把应用打包成一个独立的容器,使得团队之间的协作更加高效、部署更加方便。结合Spring Boot应用,可以通过Docker发布部署来实现Spring Boot应用的快速部署、快速扩展、资源隔离等现代化部署方式。 本篇攻略将详细讲解如何将Spring Boot应用通过Docker容器进行部署,并介绍…

    Java 2023年6月3日
    00
  • java多线程实现取款小程序

    下面是针对Java多线程实现取款小程序的完整攻略。 准备工作 在开始之前,我们需要先了解一些Java多线程方面的基础知识,如线程创建与启动、线程同步、线程通信等。这些知识我们可以通过阅读相关的书籍或者在线教程来学习掌握。 实现步骤 创建一个银行账户类,包括账户余额、账户号码等属性,以及存、取款等方法。 public class Account { priva…

    Java 2023年5月18日
    00
  • 如何在SpringBoot 中使用 Druid 数据库连接池

    使用 Druid 数据库连接池可以有效地提高数据库连接的稳定性和性能,下面是使用 Druid 数据库连接池的详细步骤和示例。 准备工作 在使用 Druid 数据库连接池之前,需要先添加相关的依赖。 <dependency> <groupId>com.alibaba</groupId> <artifactId>d…

    Java 2023年5月20日
    00
  • Java使用synchronized实现互斥锁功能示例

    实现互斥锁是多线程编程中常见的问题,Java中提供了synchronized关键字来实现互斥锁功能。 1. synchronized基本用法 1.1 使用在方法上 在方法上使用synchronized关键字,可以实现对当前对象的方法加锁,使得同一时间只能有一个线程访问该方法。 public class SynchronizedExample { public…

    Java 2023年5月26日
    00
  • Springboot日期转换器实现代码及示例

    Spring Boot 日期转换器实现代码及示例 在Spring Boot应用程序中,我们经常需要将日期字符串转换为Java日期对象或将Java日期对象格式化为日期字符串。为了实现这些功能,我们可以使用Spring Boot提供的日期转换器。在本文中,我们将详细介绍如何实现Spring Boot日期转换器,并提供两个示例说明。 实现日期转换器 在Spring…

    Java 2023年5月18日
    00
  • Spring事务失效场景原理及解决方案

    Spring事务失效场景原理及解决方案 原理 Spring事务使用AOP实现,核心原理是在程序执行前后动态代理,在方法执行前开启一个事务,在方法执行后根据方法执行结果决定事务是提交还是回滚。但是在以下场景中,Spring事务可能失效: 在事务方法外部调用另一个事务方法时,当前事务被挂起,新的事务启动,第二个事务抛出异常回滚,当前事务并不会回滚。 在catch…

    Java 2023年5月20日
    00
  • Java基础之Web服务器与Http详解

    Java基础之Web服务器与Http详解 本文主要讲解Web服务器以及Http协议的相关知识,包括Web服务器如何工作以及Http协议的原理。 Web服务器是什么? Web服务器是一种软件,用于处理客户端(通常是Web浏览器)请求并向客户端发送响应。Web服务器通常指运行HTTP服务器软件的计算机系统。Web服务器可以提供静态文件(如HTML、CSS、Jav…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部