聊聊在Servlet中怎么上传文件

当我们需要上传大文件或者一些二进制文件到服务器上的时候,需要使用文件上传功能。下面是在Servlet中实现文件上传的完整攻略:

1. 导入依赖

pom.xml文件中加入以下依赖:

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.8.0</version>
</dependency>

2. 创建Servlet

创建一个Java类,继承HttpServlet,用于处理文件上传的请求。在doPost方法中,读取文件数据,并保存到指定的目录中。文件上传的主要过程如下:

  1. 创建DiskFileItemFactory对象,用于在内存中处理文件数据和获取FileItem对象
  2. 创建ServletFileUpload对象,并设置文件的大小限制、请求编码、DiskFileItemFactory对象等处理数据的参数
  3. 调用parseRequest方法,获取所有的文件项列表
  4. 遍历文件项列表,判断是否是上传文件,并获取文件的原始名称和数据
  5. 将文件数据写入指定的目录中

示例代码如下:

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String uploadPath = "/path/to/your/upload/folder";
        int maxFileSize = 1024 * 1024 * 10; // 10MB
        int maxMemSize = 1024 * 1024 * 1; // 1MB
        String characterEncoding = "UTF-8";

        // Create a factory for disk-based file items
        DiskFileItemFactory factory = new DiskFileItemFactory();
        // Set the size threshold, above which content will be stored on disk
        factory.setSizeThreshold(maxMemSize);
        // Set the temporary directory to store the uploaded files of size above threshold
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
        // Set overall request size constraint
        upload.setFileSizeMax(maxFileSize);
        // Set overall request size constraint
        upload.setSizeMax(1024 * 1024 * 50); //50MB
        // Parse the request
        List<FileItem> items = upload.parseRequest(request);
        for (FileItem item : items) {
            // Check if the item is a file upload
            if (!item.isFormField()) {
                // Get the file name
                String fileName = item.getName();
                // Get the uploaded file's content type
                String contentType = item.getContentType();
                // Get the uploaded file data
                byte[] fileData = item.get();
                // Write the file data to the specified location
                File uploadedFile = new File(uploadPath + File.separator + fileName);
                item.write(uploadedFile);
                out.println("File " + fileName + " has been uploaded successfully.");
                out.println("<br>");
            }
        }
        out.close();
    }
}

3. 创建页面

web.xml文件中,配置Servlet和它的映射路径。然后创建一个html页面,用于选择要上传的文件。

示例代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>File Upload</title>
<style>
    body {
        font-family: Arial, sans-serif;
        margin: 20px;
    }
    h1, h2 {
        text-align: center;
    }
    form {
        width: 50%;
        margin: 0 auto;
        border: 2px solid #ccc;
        padding: 20px;
        text-align: center;
    }
    input[type="file"] {
        font-size: 1.5em;
        margin-top: 20px;
    }
    input[type="submit"] {
        font-size: 1.5em;
        margin-top: 20px;
        background: #5cb85c;
        color: #fff;
        border: none;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
    }
    input[type="submit"]:hover {
        background: #4cae4c;
    }
</style>
</head>
<body>
    <h1>File Upload Example</h1>
    <form action="upload" method="post" enctype="multipart/form-data">
        <input type="file" name="fileToUpload" id="fileToUpload">
        <br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>

4. 验证文件上传

启动应用,访问页面。在表单中选择要上传的文件,点击“Upload”按钮,即可将文件上传到服务器上。

另外一个示例:实现一个多文件上传的功能。步骤与上面基本相同,主要是在遍历文件项列表的时候,可以获取到多个文件项,并逐一处理。

public class MultipleFileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();

        String uploadPath = "/path/to/your/upload/folder";
        int maxFileSize = 1024 * 1024 * 10; // 10MB
        int maxMemSize = 1024 * 1024 * 1; // 1MB
        String characterEncoding = "UTF-8";

        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setSizeThreshold(maxMemSize);
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));

        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(maxFileSize);
        upload.setSizeMax(1024 * 1024 * 50); //50MB

        try {
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem item : items) {
                if (!item.isFormField()) {
                    String fileName = item.getName();
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                    String contentType = item.getContentType();
                    byte[] fileData = item.get();
                    File uploadedFile = new File(uploadPath + File.separator + fileName);
                    item.write(uploadedFile);
                    out.println("File " + fileName + " has been uploaded successfully.");
                    out.println("<br>");
                }
            }
            out.println("<a href=\"multiple.html\">Upload more files</a>");
        } catch (Exception ex) {
            out.println("Error: " + ex.getMessage());
            out.println("<br>");
            out.println("<a href=\"multiple.html\">Try again</a>");
        } finally {
            out.close();
        }
    }

}

页面示例代码如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Multiple File Upload</title>
<style>
    body {
        font-family: Arial, sans-serif;
        margin: 20px;
    }
    h1, h2 {
        text-align: center;
    }
    form {
        width: 50%;
        margin: 0 auto;
        border: 2px solid #ccc;
        padding: 20px;
        text-align: center;
    }
    input[type="file"] {
        font-size: 1.5em;
        margin-top: 20px;
    }
    input[type="submit"] {
        font-size: 1.5em;
        margin-top: 20px;
        background: #5cb85c;
        color: #fff;
        border: none;
        padding: 10px 20px;
        border-radius: 5px;
        cursor: pointer;
    }
    input[type="submit"]:hover {
        background: #4cae4c;
    }
</style>
</head>
<body>
    <h1>Multiple File Upload Example</h1>
    <form action="multiple" method="post" enctype="multipart/form-data">
        <input type="file" name="fileToUpload1" id="fileToUpload1">
        <br>
        <input type="file" name="fileToUpload2" id="fileToUpload2">
        <br>
        <input type="file" name="fileToUpload3" id="fileToUpload3">
        <br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>

要注意的是,在HTML页面中要添加一个enctype属性,值为multipart/form-data,以便能够正确接收文件上传的数据。另外,Servlet中需要解析请求的body部分,因此需要使用commons-fileupload提供的API方法来读取数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:聊聊在Servlet中怎么上传文件 - Python技术站

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

相关文章

  • Java用文件流下载网络文件示例代码

    Java中使用文件流下载网络文件可以通过以下步骤完成: 1.通过URL类创建网络文件的输入流(InputStream)2.创建本地文件的输出流(OutputStream)3.从网络文件的输入流中读取数据并将其写入本地文件的输出流中4.关闭输入流和输出流 具体实现步骤如下所示: 示例1:使用Java标准库实现 import java.io.InputStrea…

    Java 2023年5月20日
    00
  • Java TimedCache 带时间缓存工具类详解使用

    Java TimedCache 带时间缓存工具类详解使用 Java TimedCache 是一个开源的缓存工具类,能够实现基于时间的缓存。该工具类非常适用于需要经常访问、变化较少的数据,例如数据库或文件系统中的静态数据。下面是使用 Java TimedCache 的详细攻略。 1. 下载和导入 TimedCache 类库 可以从 GitHub 或 Maven…

    Java 2023年5月20日
    00
  • Spring boot基于JPA访问MySQL数据库的实现

    让我来给你讲解一下如何使用Spring Boot基于JPA访问MySQL数据库的实现以及示例。整个攻略将分为以下几个步骤: 创建一个Spring Boot项目 添加依赖 配置application.properties 建立实体类 建立Repository 建立Service 建立Controller 运行项目 下面是各个步骤的详细讲解: 1. 创建一个Sp…

    Java 2023年5月20日
    00
  • Java模拟qq软件的详细过程

    我们来详细讲解“Java模拟QQ软件的详细过程”的完整攻略。 1. 项目概述 这个项目的目的是使用Java语言模拟QQ软件的基本功能,包括用户登录、好友管理、信息发送等。整个项目的实现分为三部分: 客户端GUI界面的设计 服务器端的实现 客户端和服务器端之间的通信 2. 客户端GUI界面设计 客户端的GUI界面需要考虑以下几个方面: 登录界面 好友列表界面 …

    Java 2023年6月15日
    00
  • 解析Java异常的栈轨迹及其相关方法

    当Java程序出现异常时,JVM会捕获异常并打印出异常信息,其中最重要的部分就是异常的栈轨迹,它可以告诉我们异常发生的具体位置以及异常发生的原因。解析Java异常的栈轨迹及其相关方法对于排查问题而言是非常有帮助的。 1. 异常栈轨迹是什么? 异常栈轨迹是指从异常抛出点到Java虚拟机栈顶的执行路线。每个栈帧表示了方法执行的状态,栈帧之间连接起来形成一条路线,…

    Java 2023年5月27日
    00
  • java基础中异常及包归纳整理

    Java基础中异常及包归纳整理 Java作为一门高级面向对象编程语言,具有强大的异常处理机制和模块化编程的“包”机制。以下是关于Java基础中异常及包的归纳整理。 异常(Exception) Java中把程序运行中发生的不正常情况称为“异常”。异常分为两大类:受查异常和非受查异常。受查异常是指在使用一个类或者方法时,必须对其进行异常处理(try-catch或…

    Java 2023年5月27日
    00
  • mybatis 自定义实现拦截器插件Interceptor示例

    下面是详细讲解“mybatis 自定义实现拦截器插件Interceptor示例”的完整攻略: 什么是MyBatis拦截器? MyBatis 拦截器是一种插件技术,可自定义MyBatis框架自身的行为,是MyBatis框架中的重要组成部分。MyBatis 内置提供了多种拦截器,例如 Executor、StatementHandler 等,每种拦截器都实现了不同…

    Java 2023年5月20日
    00
  • 用JavaScript和注册表脚本实现右键收藏Web页选中文本

    为了实现右键收藏Web页选中文本的功能,我们需要使用JavaScript和注册表脚本。 步骤如下: 创建一个新的注册表脚本文件,将其保存为 .reg 文件类型。 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\Collect] @="收藏选中文本" [HKEY…

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