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中你所不知道的Integer详解

    关于Java中你所不知道的Integer详解 前言 Integer是Java的基本数据类型之一,它在我们的日常编码中使用频率很高,但是它背后的一些特性可能并不为人所知,这篇文章将详细讲解。 Integer的使用 在Java中,我们通常会用Integer来表示整数数据类型。Integer的定义方式如下: Integer i = 10; 我们也可以通过下面的方式…

    Java 2023年5月26日
    00
  • SpringMVC拦截器配置及运行流程解析

    SpringMVC拦截器配置及运行流程解析 前言 在 SpringMVC 中,拦截器是非常重要的一个组件之一,它可以拦截来自浏览器的请求并进行相应的处理,如登录认证、日志记录、性能监控等。本文将详细阐述 SpringMVC 拦截器的配置及运行流程,并提供两条示例说明,帮助读者更好地理解和应用拦截器。 拦截器的配置 在 SpringMVC 中,拦截器的配置是通…

    Java 2023年5月16日
    00
  • springboot 参数格式校验操作

    Spring Boot参数格式校验操作 在Spring Boot中,我们可以使用参数格式校验操作来确保请求参数的格式正确。这可以帮助我们避免一些常见的错误,例如无效的日期格式或缺少必需的参数。在本文中,我们将介绍如何使用Spring Boot参数格式校验操作。 步骤一:添加依赖 我们需要在pom.xml文件中添加Hibernate Validator的依赖项…

    Java 2023年5月15日
    00
  • JNDI在JavaEE中的角色_动力节点Java学院整理

    JNDI在JavaEE中的角色 JNDI的概念 JNDI即Java Naming and Directory Interface,是Java EE中的一个API,提供了对命名和目录服务进行访问的接口。在Java EE开发中,JNDI经常用来访问JDBC、EJB、JavaMail等资源。 JNDI的作用 使用JNDI,开发者可以将Java EE应用程序中的一些…

    Java 2023年5月20日
    00
  • Java开启新线程并传参方法代码实现

    下面是讲解“Java开启新线程并传参方法代码实现”的完整攻略: 内容概述 基本概念介绍 传统开启线程方式 Java 8 Lambda表达式实现开启线程 Java 8 方法引用实现开启线程 基本概念介绍 在线程编程中,有两种常见的线程启动方式: 继承Thread类,重写run方法,调用start方法启动线程。 实现Runnable接口,将Runnable实现类…

    Java 2023年5月26日
    00
  • 详解Java的Struts框架以及相关的MVC设计理念

    详解Java的Struts框架以及相关的MVC设计理念 什么是MVC设计模式 MVC(Model-View-Controller)是一种常见的设计模式,它将一个应用分为3种职责:模型(Model)负责数据存储与处理;视图(View)负责用户界面的显示;控制器(Controller)负责业务逻辑的处理。把系统分为3个组件使得各自的职责分明,且耦合度低。MVC的…

    Java 2023年5月20日
    00
  • 一文带你快速学会JDBC及获取连接的五种方式

    一文带你快速学会JDBC及获取连接的五种方式 JDBC(java database connectivity)是Java语言操作数据库的标准API。在Java应用程序中,我们必须通过JDBC API来获取数据库连接,进而执行SQL语句。 本文将介绍JDBC的基础知识及使用方法,并详细讲述获取连接的五种方式。 JDBC基础知识 JDBC 架构 JDBC API…

    Java 2023年5月20日
    00
  • hibernate测试时遇到的几个异常及解决方法汇总

    Hibernate测试时遇到的几个异常及解决方法汇总 在使用Hibernate进行开发时,我们常常会遇到各种异常以及错误提示,本文将总结一些常见的异常及其解决方法。 环境搭建异常:ClassNotFountException 在进行Hibernate的开发之前,我们需要搭建好相应的开发环境,如JDK、IDE、数据库等。如果其中的某一个组件环境没有搭建好,可能…

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