servlet实现文件上传与下载功能

实现文件上传和下载功能是Web开发中比较常见的需求,其中使用Servlet技术是一种比较常用的方式。下面我将从Servlet的角度详细讲解如何实现文件上传和下载功能。

文件上传

1. 创建 HTML 表单

我们需要在 HTML 表单中添加 <input> 标签,然后设置 type 属性为 file,即可实现文件上传功能。

<form action="upload" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <input type="submit" value="上传">
</form>

注意:enctype 属性需要设置为 multipart/form-data,这样才能支持文件上传。submit 按钮的 type 属性默认为 submit,不需要设置。

2. 编写 Servlet 代码

当用户选择了要上传的文件之后,提交表单,服务器将调用 Servlet 的 doPost() 方法,同时,表单数据和文件将通过 HttpServletRequest 对象进行传递。

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 获取上传文件的保存路径
    String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
    // 判断上传文件的保存目录是否存在,不存在就创建
    File file = new File(savePath);
    if(!file.exists() && !file.isDirectory()) {
        file.mkdir();
    }

    // 获取上传的文件
    Part part = req.getPart("file");
    // 获取上传文件的文件名
    String fileName = part.getSubmittedFileName();
    // 将上传的文件保存到指定目录
    part.write(savePath + File.separator + fileName);

    resp.getWriter().println("文件上传成功!");
}

以上代码的主要步骤为:

  1. 获取上传文件的保存路径,即 WEB-INF/upload 目录。
  2. 判断上传文件的保存目录是否存在,如果不存在则创建。
  3. HttpServletRequest 对象中获取上传的文件数据。
  4. 获取上传文件的文件名。
  5. 将上传的文件保存到指定目录。
  6. 返回上传成功信息。

示例

下面是一个完整的文件上传的示例代码。

首先,在 web.xml 文件中添加 Servlet 的配置:

<servlet>
    <servlet-name>UploadServlet</servlet-name>
    <servlet-class>com.example.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>UploadServlet</servlet-name>
    <url-pattern>/upload</url-pattern>
</servlet-mapping>

然后,在 UploadServlet.java 文件中编写 Servlet 代码:

package com.example;
import java.io.File;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(name = "UploadServlet", value = "/upload")
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取上传文件的保存路径
        String savePath = this.getServletContext().getRealPath("/WEB-INF/upload");
        // 判断上传文件的保存目录是否存在,不存在就创建
        File file = new File(savePath);
        if(!file.exists() && !file.isDirectory()) {
            file.mkdir();
        }

        // 获取上传的文件
        Part part = req.getPart("file");
        // 获取上传文件的文件名
        String fileName = part.getSubmittedFileName();
        // 将上传的文件保存到指定目录
        part.write(savePath + File.separator + fileName);

        resp.getWriter().println("文件上传成功!");
    }
}

最后,创建一个 HTML 页面,让用户上传文件即可。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>文件上传</title>
</head>
<body>
  <form action="upload" method="post" enctype="multipart/form-data">
    <input type="file" name="file">
    <input type="submit" value="上传">
  </form>
</body>
</html>

文件下载

1. 编写 Servlet 代码

当用户请求下载文件时,服务器将调用 Servlet 的 doGet() 方法,同时,我们需要设置 HTTP 响应头信息,告知浏览器这是一个可以下载的文件,并设置文件的 MIME 类型。

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    // 获取要下载的文件名
    String fileName = req.getParameter("fileName");
    // 设置文件的MIME类型
    resp.setContentType(this.getServletContext().getMimeType(fileName));
    // 设置Content-Disposition头信息,设置文件名和 attachment(表示浏览器会把文件当做附件下载)
    resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);

    // 读取要下载的文件,然后发送给客户端
    FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("/WEB-INF/upload/" + fileName));
    OutputStream out = resp.getOutputStream();
    byte[] buffer = new byte[1024];
    int len;
    while((len = in.read(buffer)) > 0) {
        out.write(buffer, 0, len);
    }
    in.close();
}

以上代码的主要步骤为:

  1. 获取要下载的文件名,这个文件名是从前端传递过来的。
  2. 设置文件的 MIME 类型。
  3. 设置 HTTP 响应头信息,告知浏览器这是一个可以下载的文件,并设置文件的名称和 attachment(表示浏览器会把文件当做附件下载)。
  4. 读取要下载的文件,并写入输出流中。最后,关闭输入流。

示例

下面是一个完整的文件下载的示例代码。

首先,在 web.xml 文件中添加 Servlet 的配置:

<servlet>
    <servlet-name>DownloadServlet</servlet-name>
    <servlet-class>com.example.DownloadServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>DownloadServlet</servlet-name>
    <url-pattern>/download</url-pattern>
</servlet-mapping>

然后,在 DownloadServlet.java 文件中编写 Servlet 代码:

package com.example;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;

@WebServlet(name = "DownloadServlet", value = "/download")
public class DownloadServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取要下载的文件名
        String fileName = req.getParameter("fileName");
        // 设置文件的MIME类型
        resp.setContentType(this.getServletContext().getMimeType(fileName));
        // 设置Content-Disposition头信息,设置文件名和 attachment(表示浏览器会把文件当做附件下载)
        resp.setHeader("Content-Disposition", "attachment;filename=" + fileName);

        // 读取要下载的文件,然后发送给客户端
        FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("/WEB-INF/upload/" + fileName));
        OutputStream out = resp.getOutputStream();
        byte[] buffer = new byte[1024];
        int len;
        while((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
    }
}

最后,在 HTML 页面中添加下载链接,即可实现文件下载功能。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>文件下载</title>
</head>
<body>
  <a href="download?fileName=test.pdf">下载测试文件</a>
</body>
</html>

其中,download 在 Servlet 中的 url-pattern 值为 /downloadfileName 是我们要下载的文件名,这个文件名可以从数据库、XML、文本文件等任何地方获取到。在示例中,我直接写死了一个测试文件名 test.pdf

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

(0)
上一篇 2023年6月15日
下一篇 2023年6月15日

相关文章

  • java通过实例了解值传递和引用传递

    首先,需要理解Java中两种数据类型传递方式:值传递和引用传递。值传递是指在方法调用时传递的是实际的值,而引用传递则是指传递的是对象的引用。 值传递(Value Passing) Java中的基本数据类型,如int、float、boolean等都是通过值传递的方式进行传递。这意味着,当你将一个基本数据类型作为参数传递给一个方法时,它会复制参数的值,并将其传递…

    Java 2023年5月27日
    00
  • Java利用递归算法实现查询斐波那契数

    下面我将详细讲解Java利用递归算法实现查询斐波那契数的完整攻略。 什么是斐波那契数 斐波那契数指的是一个数列,该数列从第3项开始每一项都等于前两项之和。这个数列如下所示:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, …,通常用F(n)表示该数列的第n项。 利用递归算法实现查询斐波那契数 递归是一种通过自身调用来实现循…

    Java 2023年5月19日
    00
  • 详细图解Java中字符串的初始化

    为了详细讲解“详细图解Java中字符串的初始化”的完整攻略,我会按照以下步骤进行: 1. 什么是字符串? 在Java中,字符串是一个对象,用来表示一组字符序列(包括字母、数字、符号等)。Java字符串使用Unicode字符编码,并且是不可变的对象,也就是说,它的值无法被更改。 2. 字符串的初始化方式 Java中有多种方式可以初始化字符串。下面介绍最常用的四…

    Java 2023年5月26日
    00
  • Java 格式化输出JSON字符串的2种实现操作

    接下来我将详细讲解“Java 格式化输出JSON字符串的2种实现操作”的完整攻略。 1. JSON格式化输出实现方式 在Java中格式化输出JSON字符串有很多种方式,这里将介绍最常用的两种方式:第一种是使用JSON API手动创建JSON字符串,第二种是使用Jackson、Gson等库自动序列化为JSON字符串。 1.1 使用JSON API手动创建JSO…

    Java 2023年5月26日
    00
  • Java 3种方法实现进制转换

    Java 3种方法实现进制转换是一个很基础的知识点,需要掌握的细节较多。在进行进制转换时,需要将目标进制的数位按权展开,并乘以相应的权值,再将结果相加即可。Java 语言提供了多种方法来实现进制转换,下面分别进行详细讲解: 1. 常规方法 常规方法是最直接的一种进制转换方法,使用起来简单明了。Java 提供了 Integer 类中的 toBinaryStri…

    Java 2023年5月26日
    00
  • SpringBoot导入导出数据实现方法详解

    SpringBoot导入导出数据实现方法详解 在开发Web应用程序时,数据的导入和导出是一项核心功能。SpringBoot提供了多种方式来实现数据的导入和导出,本文将详细介绍其中常用的两种方式。 基于EasyPOI实现Excel导入和导出 EasyPOI是一个简单易用的Java Excel操作库,它提供了丰富的API和自定义标签来快速创建Excel文件。下面…

    Java 2023年5月20日
    00
  • Java HashSet集合存储遍历学生对象代码实例

    Java HashSet集合存储遍历学生对象代码实例 一、背景介绍 在Java中,集合是一种非常重要的数据类型,也是面试中必考的知识点之一。HashSet是Java集合框架中的一种集合类型,它可以存储不重复的元素,非常适合用来存储一组学生对象。本文将详细讲解如何使用Java HashSet集合存储和遍历学生对象的过程和代码实例。 二、问题分析 在解决问题之前…

    Java 2023年5月26日
    00
  • 详解SpringBoot中时间类型的序列化与反序列化

    下面是关于“详解 Spring Boot 中时间类型的序列化与反序列化”的攻略。 为什么需要时间类型的序列化和反序列化 在 Web 开发中,时间类型的数据在 HTTP 请求和响应中经常使用。常见的时间类型有 java.util.Date、java.sql.Date、java.sql.Timestamp、java.time.LocalDateTime 等。我们…

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