聊聊在Servlet中怎么上传文件

yizhihongxing

当我们需要上传大文件或者一些二进制文件到服务器上的时候,需要使用文件上传功能。下面是在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 Instrumentation API?

    如何使用Java Instrumentation API Java Instrumentation API是Java平台提供的一个高级工具,用于在运行时修改或监视Java应用程序的字节码。具体来说,Instrumentation API允许我们在JVM启动应用程序之前动态地修改类定义和字节码。这使得我们能够增强应用程序的功能,例如在应用程序执行过程中收集性能…

    Java 2023年5月11日
    00
  • Java SpringBoot自动装配原理详解及源码注释

    Java SpringBoot自动装配原理详解及源码注释是一篇关于SpringBoot自动装配原理的技术文章。文章介绍了SpringBoot如何实现自动装配,包括SpringBoot自动配置的流程和源代码注释。攻略包含以下内容: 1、什么是SpringBoot自动装配 首先,我们需要知道什么是SpringBoot自动装配。当我们使用SpringBoot框架时…

    Java 2023年5月19日
    00
  • PHP关于IE下的iframe跨域导致session丢失问题解决方法

    下面我就为您详细讲解“PHP关于IE下的iframe跨域导致session丢失问题解决方法”的完整攻略。首先,我们需要了解IE浏览器下iframe跨域访问的情况。 什么是IE下的iframe跨域访问? 在IE浏览器下,iframe跨域访问是指父窗口和子窗口(即iframe窗口)在不同的域名下,例如父窗口域名为www.example.com,而子窗口的域名为w…

    Java 2023年6月16日
    00
  • Java中的==使用方法详解

    Java中的==使用方法详解 在Java中,==是一种用于比较两个变量是否相等的运算符,但是它的使用方法有一些需要注意的地方。 关于==和equals()方法 在Java中,==用于比较两个变量的引用地址是否相等,即它们是否指向同一块内存地址。而equals()方法通常被用来比较两个对象的内容是否相等。 示例1: String str1 = "he…

    Java 2023年5月20日
    00
  • java实现投票程序设计

    Java实现投票程序设计攻略 1. 了解需求 在实现投票程序之前,我们需要明确一下需求。例如: 需要设计投票选项,可以通过界面展示 需要统计投票信息,包括投票人数和每个选项的得票数 需要控制每个人只能投一次票 需要友好的界面和交互逻辑 2. 设计数据结构 针对以上需求,我们可以先设计出如下的数据结构: public class Option { privat…

    Java 2023年5月19日
    00
  • SpringBoot如何整合mybatis-generator-maven-plugin 1.4.0

    首先,我们需要在项目中添加MyBatis Generator Maven插件,该插件可自动化生成MyBatis的mappper、model和example类。下面是整合MyBatis Generator Maven插件的步骤: 添加插件依赖 在pom.xml文件的插件列表中,添加MyBatis Generator Maven插件的依赖: <plugin…

    Java 2023年5月19日
    00
  • Linux下Tomcat的几种运行方式讲解

    Linux下Tomcat的几种运行方式讲解如下: 方式一:直接启动Tomcat 在Linux环境下,我们可以通过执行Tomcat的启动脚本来启动Tomcat服务。在Tomcat的bin目录下,有一个名为catalina.sh的启动脚本,可以使用以下命令启动Tomcat: ./catalina.sh start 执行以上命令后,Tomcat将以默认配置启动,并…

    Java 2023年5月20日
    00
  • Mybatis拦截器实现自定义需求

    下面我将详细讲解Mybatis拦截器实现自定义需求的攻略: 什么是Mybatis拦截器? Mybatis拦截器是一个在Mybatis执行核心代码,解析SQL语句和执行SQL语句的过程中可以自定义添加一些拦截和处理的类。它可以实现在执行一条SQL语句前后增加一些处理逻辑,比如动态改变SQL语句、增加数据缓存和日志记录等功能。 如何实现Mybatis拦截器? 在…

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