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命令执行jar包的多种方法(四种方法)

    下面是详细讲解“java命令执行jar包的多种方法(四种方法)”的完整攻略。 一、使用java -jar命令运行jar包 将jar包放到一个单独的目录中,并在命令行中进入该目录。 使用以下命令来运行jar包: java -jar example.jar 其中example.jar是要运行的jar包的名称。 如果需要传递参数,则可以在命令中添加它们,例如: j…

    Java 2023年5月19日
    00
  • java链式创建json对象的实现

    Java中创建JSON对象的方式有很多,本文主要介绍链式创建JSON对象的方法实现。 1. 什么是链式创建JSON对象? 链式创建JSON对象是一种将多个属性值链接起来构建一个JSON对象的技术,可以使代码更简洁、更易读,但也要注意可读性。 2. 链式创建JSON对象实现的步骤 步骤1:导入依赖库 JSON库在Java中有很多选择,常用的有GSON、Fast…

    Java 2023年5月26日
    00
  • 详解在spring中使用JdbcTemplate操作数据库的几种方式

    下面是“详解在spring中使用JdbcTemplate操作数据库的几种方式”的完整攻略。 1. 前言 在Spring开发中,使用JdbcTemplate操作数据库是常见的一种方式,可以方便地完成对数据库的CRUD操作。JdbcTemplate是Spring对JDBC API的封装,使得对数据库的操作更加简单、安全和易于维护。本文将对在Spring中使用Jd…

    Java 2023年5月20日
    00
  • JAVA多线程之实现用户任务排队并预估排队时长

    JAVA多线程之实现用户任务排队并预估排队时长 问题描述 我们在开发一个应用程序时,可能需要实现任务排队功能,以确保多个用户提交的任务可以依次执行,并预估排队时长,方便用户等待。本文将介绍如何使用Java多线程技术实现用户任务排队并预估排队时长。 方案概述 我们可以使用Java的线程池技术实现任务排队功能。Java线程池是一种机制,它可以维护一组线程,以便在…

    Java 2023年5月18日
    00
  • Java中的程序计数器是什么

    Java中的程序计数器是一种内存区域,它可以记录程序当前执行的位置,以便执行下一条指令。程序计数器在Java虚拟机中扮演了非常重要的角色,它是Java多线程程序中的一种线程私有的内存空间,也是Java虚拟机规范中定义的六大内存区域之一。 程序计数器主要的作用有两个: 确保线程的恢复。程序计数器可以记录线程在执行Java字节码的过程中的位置,当线程因为时间片结…

    Java 2023年5月23日
    00
  • jdbc实现宠物商店管理系统

    下面是jdbc实现宠物商店管理系统的完整攻略: 1. 准备工作 在开始之前,需要先做好下面这些准备工作: 安装并配置好Java开发环境 安装并配置好MySQL数据库 下载并导入jdbc驱动包 2. 数据库设计 宠物商店管理系统需要管理宠物、客户和订单等信息,因此需要设计对应的数据库结构。这里简单介绍一下三个关键表的设计: 2.1. pet表 pet表包含了宠…

    Java 2023年6月16日
    00
  • Spring Boot设置并使用缓存的步骤

    让我们来讲解一下“Spring Boot设置并使用缓存的步骤”的完整攻略。 1. 添加缓存依赖 在 pom.xml 文件中添加 spring-boot-starter-cache 依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifac…

    Java 2023年5月15日
    00
  • java反编译工具Bytecode-Viewer分享

    Java反编译工具Bytecode-Viewer分享 介绍 Bytecode-Viewer是一款开放源码的Java反编译工具,支持多种不同的字节码格式并能够轻松破解Java代码。 安装和运行 下载Bytecode-Viewer的安装包并解压缩。 双击运行安装包,按照安装向导完成安装。 运行安装后的Bytecode-Viewer程序。 使用方法 打开Java字…

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