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日

相关文章

  • MyBatis-Plus如何最优雅最简洁地完成数据库操作

    MyBatis-Plus 如何最优雅最简洁地完成数据库操作攻略 MyBatis-Plus 是基于 MyBatis 的一款优秀的增强工具库,它可以帮助开发者简化操作、提升开发效率。下面,我们将详细介绍 MyBatis-Plus 如何最优雅最简洁地完成数据库操作。 一、如何引入 MyBatis-Plus 在 pom.xml 中添加如下 Maven 依赖: &lt…

    Java 2023年5月20日
    00
  • Spring注解方式无法扫描Service注解的解决

    当使用Spring注解方式配置应用程序时,有时可能会出现在扫描Service注解时无法识别的问题。出现这个问题的原因一般是因为缺少在Spring中定义Service注解扫描器的配置或者配置错误。解决此类问题需要进行以下设置: 添加@Service注解扫描器。 要使Spring扫描@Service注解,需要在Spring配置文件中配置注解扫描器,如下所示: &…

    Java 2023年5月20日
    00
  • 关于springboot整合swagger问题及解决方法

    标题:关于SpringBoot整合Swagger问题及解决方法 一、背景介绍 在Web应用的开发过程中,文档的撰写和维护是一项繁琐而必要的工作。而Swagger是一种API文档生成工具,它可以自动创建文档,减少文档维护的工作量。在SpringBoot项目中,Swagger也是一种常用的文档生成工具。本文将介绍在SpringBoot项目中使用Swagger出现…

    Java 2023年6月15日
    00
  • struts2如何使用拦截器进行用户权限控制实例

    下面是详细的 “struts2如何使用拦截器进行用户权限控制实例”攻略,包含两条示例。 Struts2拦截器实现用户权限控制 在Struts2中,我们可以使用拦截器来实现用户权限控制。通过定义自定义的拦截器,在拦截器中可以获取当前用户的权限信息并进行验证,从而决定是否允许当前的请求执行。 实现步骤 以下是使用拦截器实现用户权限控制的基本步骤: 创建拦截器类 …

    Java 2023年5月20日
    00
  • springboot快速集成mybatis-plus的详细教程

    下面是“springboot快速集成mybatis-plus的详细教程”: 1. 引入依赖 首先,在pom.xml文件中加入以下依赖: <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</a…

    Java 2023年5月20日
    00
  • 图书管理系统java代码实现

    我们来详细讲解一下“图书管理系统Java代码实现”的完整攻略。 1. 确定项目需求并设计数据库 在开发一个图书管理系统前,我们需要先确定其需求。例如,一个简单的图书管理系统通常需要包含以下基本功能: 图书的添加,修改和删除操作 图书的查找和查询操作 图书的借阅和归还操作 一旦需求确定,我们就可以开始设计数据库表结构了。一个基本的图书管理系统需要包含图书表、读…

    Java 2023年5月19日
    00
  • SpringBoot整合JWT框架,解决Token跨域验证问题

    SpringBoot整合JWT框架,解决Token跨域验证问题 在Web应用程序中,跨域请求是非常常见的。为了保护我们的Web应用程序,我们通常使用Token来进行身份验证和授权。在本文中,我们将详细讲解如何使用JWT框架来实现Token身份验证,并解决跨域请求的问题。 JWT简介 JWT(JSON Web Token)是一种开放标准(RFC 7519),它…

    Java 2023年5月18日
    00
  • Java中的类和对象是什么?

    Java是面向对象编程语言,类和对象是Java语言中的核心概念之一。 1. 类和对象是什么? 类是一种封装了数据和方法的模板,用于描述具有某种共同特征的对象的集合,是Java中最基本的组成单元之一。 对象是类的实例化对象,通过使用new操作符可以创建出一个类的具体实例。每一个对象都有自己的属性和行为。 例如,假如存在一个Person类,那么这个Person类…

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