简单实现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 文件。

阅读剩余 73%

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

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

相关文章

  • SpringBoot 统一异常处理详解

    让我来详细讲解“SpringBoot 统一异常处理详解”的完整攻略。 1. 异常处理的意义 在我们的应用程序中,异常是不可避免的。这些异常可能是由于用户输入不正确、服务器错误、网络问题等各种原因引起的。当这些异常不被处理时,它们将会导致应用程序无法继续正常运行,严重时甚至会引起系统崩溃。 因此,在我们的应用程序中,为了保证程序的安全性和稳定性,必须对这些异常…

    Java 2023年5月27日
    00
  • Spring Boot2+JPA之悲观锁和乐观锁实战教程

    下面我就为您讲解Spring Boot2 + JPA悲观锁和乐观锁实战教程的完整攻略。 1. 悲观锁实战 1.1 悲观锁的概念 悲观锁是指,当在执行某一操作时,认为别的并发操作会对其产生影响,因此在执行前进行加锁,使得其他并发操作无法操作,直到该操作完成释放锁。 1.2 悲观锁的实现 在JPA中,实现悲观锁可以通过 @Lock 注解来实现。具体实现方法如下:…

    Java 2023年5月20日
    00
  • SQL 注入式攻击的本质

    SQL注入式攻击指的是攻击者通过在应用程序的输入框中插入恶意的SQL代码,让数据库执行攻击者所期望的操作。SQL注入攻击通常被用来窃取敏感信息、修改数据库数据、或者进行其他恶意操作。 攻击者会尝试在表单、搜索框、登录框等应用程序的输入框中插入SQL代码。如果输入框没有进行正确的数据过滤与转义,攻击者就可以通过输入特定的SQL语句来修改数据库中的数据,这种攻击…

    Java 2023年6月15日
    00
  • Spring Security使用数据库认证及用户密码加密和解密功能

    下面是使用Spring Security实现数据库认证和密码加密/解密的完整攻略: 一、创建数据库 首先,我们需要创建一个数据库,用于存储用户信息。假设我们的数据库名为security_demo,包含一张名为user的用户表,其中包含id、username、password、enabled四个字段。我们可以使用如下的SQL语句创建该表: CREATE TAB…

    Java 2023年5月20日
    00
  • java代码实现mysql分表操作(用户行为记录)

    下面是详细讲解“Java代码实现MySQL分表操作(用户行为记录)”的完整攻略: 一、需求背景 在实际应用中,用户行为记录是一项重要的工作。随着用户数量的不断增加,数据量也随之增加,如果所有的用户行为记录都存放在同一张表中,会严重影响数据库的性能。因此,我们需要对用户行为记录进行分表操作,以减轻数据库的压力。 二、分表方案 在分表方案中,我们可以按照时间、用…

    Java 2023年5月20日
    00
  • SpringSecurity oAuth2.0的四种模式(小结)

    SpringSecurity OAuth2.0的四种模式 SpringSecurity OAuth2.0提供了四种授权模式,分别是Authorization Code、Implicit、Resource Owner Password Credentials和Client Credentials。下面将分别对这四种授权模式进行详细讲解。 Authorizati…

    Java 2023年5月20日
    00
  • 关于Spring Cloud 本地属性覆盖的问题

    Spring Cloud 配置中心提供了一种方便的方式来管理应用程序的配置。但是,当在本地的配置文件中设置了属性值时,我们可能会遇到Spring Cloud本地属性覆盖的问题。下面我们将讲解如何解决这个问题。 问题描述 在使用Spring Cloud Config作为配置中心时,如果我们在本地的配置文件中定义了一些属性,那么这些属性就会将从Spring Cl…

    Java 2023年5月20日
    00
  • SpringBoot整合ip2region实现使用ip监控用户访问城市的详细过程

    下面是整合ip2region实现使用ip监控用户访问城市的详细过程: 步骤一:创建SpringBoot项目 首先,我们需要创建一个SpringBoot项目,可以使用Spring Initializr(https://start.spring.io/)来创建项目。 步骤二:添加依赖 在创建完成后,在pom.xml文件中添加ip2region的Maven依赖: …

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