java使用common-fileupload实现文件上传

下面是使用Commons FileUpload实现Java文件上传的完整攻略:

前提条件

在使用Commons FileUpload之前,需要确保你已经满足以下的条件:

  1. 已经安装了Java SDK(至少是1.6或以上版本)

  2. 已经使用Eclipse等集成开发环境,或者手动配置好了Java的CLASSPATH。

  3. 已经有一个能够接受文件上传请求的Java Web应用程序。

Step 1:引入Commons FileUpload

你需要下载并将Commons FileUpload JAR包导入到你的Java Web应用程序中,这样才能在Java代码中使用它提供的API。

在Maven项目中,你可以通过以下方式引入依赖:

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

在普通的Java Web应用程序中,你可以从Apache的官网下载最新版本的JAR包,并将它们拷贝到你的WEB-INF/lib目录中。

Step 2:实现文件上传的Servlet

接下来,你需要创建一个Servlet,用于接收上传的文件。在Servlet中,你需要实现以下的步骤:

  1. 检查请求中是否包含上传的文件。如果不包含,直接返回错误提示。

  2. 解析上传的文件内容。这会输出一个FileItem对象数组。

  3. 迭代这个数组,将上传的每个文件保存到磁盘上。

下面是一个示例Servlet代码:

import java.io.File;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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;

@WebServlet("/FileUploadServlet")
public class FileUploadServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;
    private static final String UPLOAD_DIRECTORY = "uploads";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是,则返回错误提示
            PrintWriter writer = response.getWriter();
            writer.println("Error: Please specify enctype='multipart/form-data' in your form.");
            writer.flush();
            return;
        }

        // 创建一个DiskFileItemFactory,用于解析上传的文件内容
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置缓存大小
        factory.setSizeThreshold(1024 * 1024 * 10); // 10MB

        // 设置临时目录
        File tempDir = new File(System.getProperty("java.io.tmpdir"));
        factory.setRepository(tempDir);

        // 初始化ServletFileUpload
        ServletFileUpload upload = new ServletFileUpload(factory);

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

        // 设置上传内容大小的限制
        upload.setSizeMax(1024 * 1024 * 150); // 150MB

        // 设置上传文件存储的目录
        String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;

        // 确保目录存在
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        // 解析上传内容
        try {
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 循环遍历每个文件项
                for (FileItem item : formItems) {
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在服务器中保存文件
                        item.write(storeFile);
                        request.setAttribute("message", "File " + fileName + " has uploaded successfully.");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message", "There was an error: " + ex.getMessage());
        }

        // 返回成功提示
        getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    }
}

示例 1:基本上传

下面是一个基本文件上传的示例代码,包括一个上传文件的HTML表单和用于接收上传的Servlet。该示例将上传的文件保存在指定目录下:

HTML Form

<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>

Servlet

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;
    private static final String UPLOAD_DIRECTORY = "uploads";

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是,则返回错误提示
            PrintWriter writer = response.getWriter();
            writer.println("Error: Please specify enctype='multipart/form-data' in your form.");
            writer.flush();
            return;
        }

        // 创建一个DiskFileItemFactory,用于解析上传的文件内容
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置缓存大小
        factory.setSizeThreshold(1024 * 1024 * 10); // 10MB

        // 设置临时目录
        File tempDir = new File(System.getProperty("java.io.tmpdir"));
        factory.setRepository(tempDir);

        // 初始化ServletFileUpload
        ServletFileUpload upload = new ServletFileUpload(factory);

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

        // 设置上传内容大小的限制
        upload.setSizeMax(1024 * 1024 * 150); // 150MB

        // 设置上传文件存储的目录
        String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;

        // 确保目录存在
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        // 解析上传内容
        try {
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 循环遍历每个文件项
                for (FileItem item : formItems) {
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在服务器中保存文件
                        item.write(storeFile);
                        request.setAttribute("message", "File " + fileName + " has uploaded successfully.");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message", "There was an error: " + ex.getMessage());
        }

        // 返回成功提示
        getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    }
}

示例 2:限制上传文件类型

下面是一个示例代码,用于在上传文件时限制文件类型:

HTML Form

<form action="FileUploadServlet" method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="Upload" />
</form>

Servlet

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;
    private static final String UPLOAD_DIRECTORY = "uploads";
    private static final String[] ALLOWED_FILE_TYPES = new String[]{"jpg", "jpeg", "png", "gif"};

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            // 如果不是,则返回错误提示
            PrintWriter writer = response.getWriter();
            writer.println("Error: Please specify enctype='multipart/form-data' in your form.");
            writer.flush();
            return;
        }

        // 创建一个DiskFileItemFactory,用于解析上传的文件内容
        DiskFileItemFactory factory = new DiskFileItemFactory();

        // 设置缓存大小
        factory.setSizeThreshold(1024 * 1024 * 10); // 10MB

        // 设置临时目录
        File tempDir = new File(System.getProperty("java.io.tmpdir"));
        factory.setRepository(tempDir);

        // 初始化ServletFileUpload
        ServletFileUpload upload = new ServletFileUpload(factory);

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

        // 设置上传内容大小的限制
        upload.setSizeMax(1024 * 1024 * 150); // 150MB

        // 设置上传文件存储的目录
        String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;

        // 确保目录存在
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        // 解析上传内容
        try {
            @SuppressWarnings("unchecked")
            List<FileItem> formItems = upload.parseRequest(request);

            if (formItems != null && formItems.size() > 0) {
                // 循环遍历每个文件项
                for (FileItem item : formItems) {
                    if (!item.isFormField()) {
                        String fileName = new File(item.getName()).getName();
                        String fileExtension = fileName.substring(fileName.lastIndexOf(".") + 1);
                        if (!isValidFileType(fileExtension)) {
                            // 如果上传的文件类型不在指定范围内,则返回错误提示
                            PrintWriter writer = response.getWriter();
                            writer.println("Error: File type " + fileExtension + " is not allowed.");
                            writer.flush();
                            return;
                        }
                        String filePath = uploadPath + File.separator + fileName;
                        File storeFile = new File(filePath);
                        // 在服务器中保存文件
                        item.write(storeFile);
                        request.setAttribute("message", "File " + fileName + " has uploaded successfully.");
                    }
                }
            }
        } catch (Exception ex) {
            request.setAttribute("message", "There was an error: " + ex.getMessage());
        }

        // 返回成功提示
        getServletContext().getRequestDispatcher("/index.jsp").forward(request, response);
    }

    private boolean isValidFileType(String fileExtension) {
        for (String allowedFileType : ALLOWED_FILE_TYPES) {
            if (allowedFileType.equalsIgnoreCase(fileExtension)) {
                return true;
            }
        }
        return false;
    }
}

在上面的示例代码中,我们添加了一个isValidFileType()方法,用于检查上传的文件类型是否为允许的文件类型。如果上传的文件类型不在指定范围内,我们将输出一个错误提示,并且不会保存上传的文件。

希望这个攻略可以帮助到你~

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java使用common-fileupload实现文件上传 - Python技术站

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

相关文章

  • 详解JAVA 原型模式

    详解JAVA 原型模式 什么是原型模式? 原型模式(Prototype Pattern),又叫克隆模式,是指通过复制已经存在的一个对象生成一个新的对象,新的对象是通过对原始对象进行复制而生成的,原始对象就可以充当新对象的一个原型。原型模式是一种创建型模式,其作用是通过把一个实例作为原型,复制出新的实例来。 原型模式的使用场景 在需要创建对象的过程中,如果创建…

    Java 2023年5月19日
    00
  • 详解Java中Thread 和Runnable区别

    当开发多线程程序时,Java中有两种方式可以创建线程:继承Thread类或实现Runnable接口。虽然它们最终实现的目标是相同的,但它们之间仍然存在一些重要区别。本文将详细讲解Thread和Runnable的区别,让您在编写多线程程序时选择最佳方案。 一、继承Thread类 继承Thread类是创建线程的传统方式。这是通过继承Thread类并覆盖其中的ru…

    Java 2023年5月18日
    00
  • 图文详解Java的反射机制

    图文详解Java的反射机制 什么是Java的反射机制 Java的反射机制指的是通过程序来访问、检测、修改已编译的代码中的信息。在运行时,Java程序可以获取类的信息、构造方法、方法、属性等。 反射机制的优点 使用Java的反射机制可以增强程序的灵活性、可扩展性和封装性。具体来说,反射机制可以提高代码的复用性,增加代码的动态性,并使程序的设计更加灵活和可扩展。…

    Java 2023年5月26日
    00
  • 【深入浅出Spring原理及实战】「源码调试分析」深入源码探索Spring底层框架的的refresh方法所出现的问题和异常

    学习Spring源码的建议 阅读Spring官方文档,了解Spring框架的基本概念和使用方法。 下载Spring源码,可以从官网或者GitHub上获取。 阅读Spring源码的入口类,了解Spring框架的启动过程和核心组件的加载顺序。 阅读Spring源码中的注释和文档,了解每个类和方法的作用和用法。 调试Spring源码,可以通过IDEA等工具进行调试…

    Java 2023年4月24日
    00
  • IDEA快速搭建jsp项目的图文教程

    下面我将为你详细讲解如何通过IDEA快速搭建jsp项目的完整攻略,其中包括了图文教程和示例说明。 第 1 步:创建项目 打开 IntelliJ IDEA 软件; 点击菜单栏“File”-“New”-“Project”; 在弹出的对话框中,选择“Java Enterprise”-“Web Application”; 在下一步中,选择创建项目的位置,填写项目的名…

    Java 2023年6月15日
    00
  • 任意Json转成无序列表的方法示例

    下面是详细讲解“任意Json转成无序列表的方法示例”的完整攻略。 1. 理解Json数据格式 首先,我们需要了解Json数据格式。Json是一种轻量级的数据交换格式,它可以表示对象、数组、字符串、数字、布尔值和null。Json对象由花括号{}包裹,对象中包含各种键值对,键值对之间用逗号分隔;Json数组由方括号[]包裹,数组中包含各种数据类型,数据之间用逗…

    Java 2023年6月16日
    00
  • Maven 修改tomcat运行版本和端口的实现方法

    以下是“Maven 修改 Tomcat 运行版本和端口的实现方法”的攻略。 介绍 Maven是一个Java项目管理工具,可以自动化构建,依赖管理,以及项目信息管理。它的一个重要作用就是可以将项目打包成一个可以部署的War包。而Tomcat是一个Java Web应用程序服务器,可以运行打包好的War包。 在Maven的项目中,我们可以使用插件来管理Tomcat…

    Java 2023年5月20日
    00
  • SpringSecurity从数据库中获取用户信息进行验证的案例详解

    下面将为您详细讲解Spring Security从数据库中获取用户信息进行验证的攻略。 什么是Spring Security Spring Security是一个功能强大、可高度定制的认证和授权框架,可用于保护基于Spring的Java应用程序。它提供了基于角色、用户和访问级别的身份验证和授权,以及多种身份验证选项,包括基本身份验证、OAuth和JWT等。 …

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