Servlet实现多文件上传功能

  1. 程序介绍

Servlet 是 Java Web 应用程序的基础组件。它是作为服务器端程序运行的 Java 类,用来处理传入的 web 请求并生成响应的 web 页面。

Servlet 允许开发人员开发动态的 Web 应用,因此很多 Web 应用都是使用 Servlet 编写的。为了更好地满足用例需求,本文将介绍如何使用 Servlet 去实现多文件上传功能。

  1. 准备工作

要准备好环境以便于使用 Servlet,需要以下三个软件:

  • Java SE Development Kit (JDK):Java SE Development Kit ,是 Oracle 官方发布的 Java SE 应用程序开发工具包,用于编码、编译和运行 Java 应用程序。
  • Apache Tomcat:Apache Tomcat 是一款基于 Java 技术的 Web 服务器,支持 Servlet 和 JSP。
  • Eclipse IDE:Eclipse 是 Java 开发的集成开发环境。使用 Eclipse 开发 Servlet 应用程序可以方便地构建和调试 Servlet 应用程序。

  • 实现多文件上传方法

在 Servlet 中实现多文件上传的方法如下:

首先你需要创建一个 HTML 页面,用于上传文件。代码示例如下:

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

其中,action 属性指定了提交的 URL 地址;method 属性指定了提交的方法;enctype 属性指定了表单数据的编码类型,multipart/form-data 表示支持二进制上传。

在 Servlet 的 doGet 方法中,你可以处理 GET 请求。在这里,你需要在 doGet 方法中调用 doPost 方法来处理 POST 请求,如下所示:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    this.doPost(request, response);    
}

在 doPost 方法中,你可以处理文件上传请求。在 Servlet 中上传文件使用的是 commons-fileupload 库。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 创建 DiskFileItemFactory 的实例,以便在设置上传参数时使用
    DiskFileItemFactory factory = new DiskFileItemFactory();

    // 设置内存阈值,超过后将产生临时文件并存储于临时目录中
    factory.setSizeThreshold(1024 * 1024 * 10);

    // 设置临时存储目录
    File uploadFolder = new File(getServletContext().getRealPath("/tmp"));
    if (!uploadFolder.exists()) {
        uploadFolder.mkdirs();
    }
    factory.setRepository(uploadFolder);

    // 创建一个文件上传解析器
    ServletFileUpload upload = new ServletFileUpload(factory);

    // 设置上传文件的总大小限制
    upload.setFileSizeMax(1024 * 1024 * 20);

    // 每个上传文件限制大小 
    upload.setSizeMax(1024 * 1024 * 20);

    // 处理上传文件
    List<FileItem> items = upload.parseRequest(request);
    for (FileItem item : items) {
        if (!item.isFormField()) {
            String fileName = item.getName();
            String filePath = "d:\\" + File.separator + fileName;
            File uploadedFile = new File(filePath);
            item.write(uploadedFile);
        }
    }
}
  1. 示例1

在这个示例中,我们在 HTML 页面中上传一个文件,该文件将被保存在 D 盘根目录。

HTML 代码如下:

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

Servlet 代码如下:

@WebServlet("/file-upload")
public class FileUploadServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private static final String UPLOAD_DIRECTORY = "d:" + File.separator;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 上传文件目录
        File uploadDir = new File(UPLOAD_DIRECTORY);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        try {
            List<FileItem> formItems = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
            if (formItems != null && formItems.size() > 0) {
                for (FileItem item : formItems) {
                    // 如果是普通表单域,保存到 request 中
                    if (item.isFormField()) {
                        request.setAttribute(item.getFieldName(), item.getString("UTF-8"));
                    } else {
                        String fileName = new File(item.getName()).getName();
                        String filePath = UPLOAD_DIRECTORY + File.separator + fileName;
                        File storeFile = new File(filePath);
                        item.write(storeFile);
                        request.setAttribute("message", "文件上传成功!");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message", "文件上传失败: " + ex.getMessage());
        }

        // 跳转到 message.jsp 页面
        request.getRequestDispatcher("/message.jsp").forward(request, response);
    }
}
  1. 示例2

在这个示例中,我们在 HTML 页面中上传多个文件,并将它们以 JSONArray 形式呈现出来。

HTML 代码如下:

<!doctype html>
<html>
<head>
    <meta charset="UTF-8">
    <title>多文件上传示例</title>
</head>
<body>
    <form action="multi-file-upload" method="post" enctype="multipart/form-data">
        <input type="file" name="filename" multiple>
        <br>
        <input type="submit" value="上传">
    </form>
</body>
</html>

Servlet 代码如下:

@WebServlet("/multi-file-upload")
public class MultiFileUploadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        JSONArray array = new JSONArray(); // 保存文件信息的 JSONArray
        String uploadDir = "d:\\files\\";

        // 创建 factory 和 servletFileUpload 实例
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload servletFileUpload = new ServletFileUpload(factory);

        try {
            // 处理上传请求
            List<FileItem> fileItems = servletFileUpload.parseRequest(request);
            if (fileItems != null && fileItems.size() > 0) {
                for (FileItem fileItem : fileItems) {
                    if (!fileItem.isFormField()) { // 如果项是文件
                        String fileName = fileItem.getName();
                        String filePath = uploadDir + fileName;
                        File storeFile = new File(filePath);
                        fileItem.write(storeFile); // 保存文件到指定目录

                        // 保存文件信息到 JSONArray 中
                        JSONObject obj = new JSONObject();
                        obj.put("name", fileName);
                        obj.put("size", fileItem.getSize());
                        obj.put("type", fileItem.getContentType());
                        array.add(obj);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 将文件信息 JSONArray 作为属性绑定到 request 对象上
        request.setAttribute("files", array);

        // 跳转到 message.jsp 页面
        request.getRequestDispatcher("/message.jsp").forward(request, response);
    }
}

6.总结

在本文中,我们介绍了使用 Servlet 实现多文件上传功能的完整攻略。为了实现文件上传,我们使用了 commons-fileupload 库,同时给出了两个示例供读者参考。

希望这篇文章对学习 Servlet 进行 Web 开发的读者有所帮助。

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

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

相关文章

  • SpringBoot上传文件大小受限问题的解决办法

    关于SpringBoot上传文件大小受限问题的解决办法,在此提供完整攻略和两条示例。 问题描述 在SpringBoot的应用中,上传文件大小默认限制为1MB,如果上传的文件超过1MB,就会导致上传失败或无法上传。解决这个问题的方法就是通过设置最大的上传文件大小来解决。 解决办法 SpringBoot提供了两个配置参数来解决上传文件大小的限制问题。 1. 使用…

    Java 2023年5月19日
    00
  • SpringBoot 日志的配置及输出应用教程

    SpringBoot 日志的配置及输出应用教程 介绍 在开发过程中,日志是非常重要的。它可以帮助开发者了解应用程序中的每个步骤,并且帮助解决问题。Spring Boot 提供了多种日志框架,如 Logback、Log4j2、Java Util Logging 和 Commons Logging 等。这篇教程将详细介绍 SpringBoot 日志的配置及输出应…

    Java 2023年5月26日
    00
  • 关于SQL注入绕过的一些知识点

    关于SQL注入绕过的知识点,这是一项非常复杂的话题,需要掌握的知识点比较多,下面我会给大家详细解析。 1.理解SQL注入的定义 我们首先需要清楚SQL注入是什么,顾名思义,SQL注入就是对网站中使用的SQL语句进行注入,从而达到非法获取数据或者控制网站的目的。这种攻击方式是因为开发者在编写代码的时候没有进行充分的输入验证而导致网站的漏洞造成的。 2. 理解S…

    Java 2023年6月15日
    00
  • Sping Security前后端分离两种实战方案

    下面我将详细讲解“Sping Security前后端分离两种实战方案”的完整攻略。 方案概述 Spring Security作为一个强大的安全框架,在项目中得到了广泛的应用,但是其安全配置可能会随着项目的复杂度而变得非常繁琐。而前后端分离的架构模式也越来越多地被应用在实际项目中,那么如何在Spring Security中实现前后端分离呢?本文将介绍两种前后端…

    Java 2023年5月20日
    00
  • Java实现扫雷游戏详细代码讲解

    Java实现扫雷游戏详细代码讲解 前言 扫雷是经典的小游戏之一,本文将详细讲解如何使用Java实现扫雷游戏,并提供完整的代码示例。 实现思路 界面设计:使用Swing开发GUI界面,布置扫雷棋盘、计时和雷数量显示。 地图生成:随机生成地图,并根据雷的数量给出提示。 扫雷逻辑:根据用户点击的位置判断是否为雷,显示相应的数字或“game over”等提示信息。 …

    Java 2023年5月23日
    00
  • Java JWT实现跨域身份验证方法详解

    Java JWT实现跨域身份验证方法详解 什么是JWT JWT(JSON Web Tokens)是一种用于身份验证的安全传输方式。JWT 通常被用于在客户端和服务器之间传递身份识别信息,以便于进行身份验证和授权。 JWT的组成 JWT 由三部分组成,分别是: Header,头部信息,包含JWT的类型以及算法。 Payload,负载信息,包含需要传递的数据。比…

    Java 2023年6月3日
    00
  • @Validated和@Valid三种异常捕获处理方式

    下面是 @Validated 和 @Valid 的详细讲解和异常捕获处理方式攻略: 1. @Validated 和 @Valid 的区别 @Validated 和 @Valid 都是基于 JSR-303 的 Bean Validation 规范来进行数据校验的注解。 @Validated 注解是 Spring 提供的用于参数校验和值校验的注解。它可以让 Sp…

    Java 2023年5月27日
    00
  • Java8新特性之深入解析日期和时间_动力节点Java学院整理

    Java8新特性之深入解析日期和时间_动力节点Java学院整理 为什么需要新的日期和时间API Java早期的日期和时间API出现了很多问题,如: API不一致:Java提供了大量日期和时间API,但它们之间的API不一致,这使得编写日期和时间代码非常困难。 可变性:Java早期的日期和时间API中的大多数类都是可变的,这意味着我们可以随时更改日期和时间,这…

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