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日

相关文章

  • NUXT SSR初级入门笔记(小结)

    NUXT SSR初级入门笔记(小结) 1. 什么是NUXT SSR NUXT SSR(Server-Side Rendering)是基于Vue.js的一个SSR框架。NUXT SSR可以将Vue组件实例渲染成HTML字符串,然后将这个HTML字符串响应给浏览器,从而让浏览器更快地呈现页面。通过NUXT SSR,可以提高页面的首屏渲染速度和SEO优化。 2. …

    Java 2023年6月15日
    00
  • 使用Java代码进行因数分解和求最小公倍数的示例

    当我们需要在Java程序中进行因数分解和求最小公倍数的计算时,我们可以选择使用Java自带的Math类中的方法。下面我会分别介绍解题思路和代码实现。 因数分解 对于因数分解,我们可以利用Math类中的sqrt()方法求出目标数的平方根,然后从2开始递增,试图将其除尽,直到除不了为止。具体实现如下: /** * 因数分解 * * @param n 待分解的数 …

    Java 2023年5月19日
    00
  • 基于module-info.class的问题

    “基于module-info.class的问题” 在Java 9之前是不存在的。 Java SE 9中引入了模块化系统,它引入了一个新的文件模块描述符module-info.java。module-info.java包含有关模块的信息,包括模块依赖关系,公共包导入等。在模块化系统中,其他类需要使用Java模块,需要module-info.java中导入的包。…

    Java 2023年5月19日
    00
  • 详解ArrayBlockQueue源码解析

    详解ArrayBlockingQueue源码解析 ArrayBlockingQueue是Java集合框架中的阻塞队列,该队列的容量固定不变,而且是有界的。它是线程安全的,任何时刻只有一个线程能够访问队列,当队列已满时插入元素的线程会被阻塞,当队列为空时,获取元素的线程会被阻塞。 基本特性 固定容量大小 先进先出 线程安全 阻塞队列 主要方法 ArrayBlo…

    Java 2023年5月26日
    00
  • Java日期与时间类原理解析

    Java日期与时间类原理解析 介绍 Java日期与时间类是Java标准库中的一个重要组成部分,它提供了一系列的类和方法,用于处理日期、时间和时间区域相关的问题。在Java程序开发中,日期和时间是必不可少的数据类型,因此学习Java日期与时间类是非常重要的。 本文将介绍Java日期与时间类的原理和使用,包括常用类:Date、DateFormat、SimpleD…

    Java 2023年5月20日
    00
  • Java中Volatile关键字详解及代码示例

    一、什么是Volatile? Volatile是Java中的一种轻量级的同步机制,用于解决多线程并发访问共享变量时的可见性问题,它保证了对变量的修改能够被立即,且正确的读取到。Volatile在Java内存模型中的作用是用来保证线程间数据的可见性。 二、Volatile关键字的使用 声明Volatile变量 Volatile变量的声明格式为:volatile…

    Java 2023年5月28日
    00
  • 详解在Spring Boot中使用Mysql和JPA

    我将为你详细讲解“详解在Spring Boot中使用Mysql和JPA”的完整攻略。 准备工作 在开始时,您需要以下软件和环境:- JDK >= 1.8- Spring Boot >= 2.0.0.RELEASE- MySQL- Maven 创建Spring Boot项目 首先,您需要创建一个Spring Boot项目。您可以使用Spring官网…

    Java 2023年5月20日
    00
  • Java基础之Thymeleaf的简单使用

    下面是“Java基础之Thymeleaf的简单使用”的完整攻略。 1. 什么是Thymeleaf Thymeleaf是一种服务器端Java模板引擎,它能够处理HTML、XML、JavaScript、CSS、文本等模板。与其他模板引擎相比,Thymeleaf有以下特点: 语法简单且易于学习; 支持自然模板:模板可以在浏览器中预览,而不需要部署到客户端; 支持表…

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