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

实现文件上传和下载功能是Web开发中比较常见的需求,其中使用Servlet技术是一种比较常用的方式。下面我将从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实现文件上传与下载功能

基础教程推荐