JSP实现文件上传功能

下面就是使用JSP实现文件上传功能的攻略。

1. 前置准备

在进行文件上传的操作时,需要使用到Web容器提供的Servlet API和一些第三方的类库,所以在开始实现前,需要进行一些前置准备。

1.1. 导入第三方类库

上传文件过程中,需要用到Apache的常用文件上传组件commons-fileupload,所以需要下载并导入到项目中。在项目中创建一个名叫lib的文件夹(如果已经存在可以跳过),然后将下载好的commons-fileupload-1.4.jar文件复制到该文件夹下。接着,右键单击该jar包文件,选择Build Path -> Add to Build Path,即可将其导入到项目中。

1.2. 导入Servlet API

在使用Servlet时,需要导入Servlet的API包,如果使用的是Maven进行项目管理,则不需要额外导入,否则需要手动导入Servlet API包。

2. 实现文件上传

实现文件上传的关键就是通过multipart/form-data类型的POST请求提交表单,然后在Servlet中接收上传文件的InputStream对象,将其写入到磁盘中保存。

下面是通过JSP实现文件上传的步骤:

2.1. 创建文件上传页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data" method="post">
        <input type="file" name="file"/>
        <input type="submit" value="上传"/>
    </form>
</body>
</html>

在页面中我们使用了<form>标签提交一个multipart/form-data类型的表单,并指定了POST请求的地址和请求方法。表单中包括一个文件选择框和一个提交按钮。

2.2. 编写Servlet类处理上传请求

@WebServlet("/upload")
@MultipartConfig // 必须添加该注解
public class UploadServlet extends HttpServlet {

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

        PrintWriter out = response.getWriter();
        try {
            Part part = request.getPart("file");
            String fileName = part.getSubmittedFileName();

            InputStream is = part.getInputStream();
            byte[] buffer = new byte[1024];
            int len;
            String filePath = "/tmp/" + fileName;
            OutputStream os = new FileOutputStream(filePath);

            while ((len = is.read(buffer)) > 0) {
                os.write(buffer, 0, len);
            }

            os.close();
            is.close();

            out.println("文件上传成功!");
            out.println("<a href='index.jsp'>返回首页</a>");
        } catch (FileNotFoundException e) {
            out.println("上传文件不存在!");
        } catch (IOException e) {
            out.println("上传文件失败!");
        }
    }
}

在该Servlet中,我们首先获得请求中的文件流,然后通过Part#getSubmittedFileName()方法获取上传的文件的原始名称,并将文件写入到磁盘中。最后通过PrintWriter对象输出上传结果。

需要注意的是,我们在Servlet类上添加了@MultipartConfig注解,来指定Servlet支持文件上传的类型和最大文件大小等必要的配置。

2.3. 测试

上传完成后,可以在磁盘上查看上传文件是否保存成功。在浏览器中打开上传页面,选择一个文件,单击“上传”按钮,上传完成后成功提示信息会显示在页面上。

3. 使用第三方类库

commons-fileupload是Apache的一个常用文件上传库,其可以方便地解析请求中的文件,并提供文件上传的处理方法。

3.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.6</version>
</dependency>

3.2. 编写Servlet类处理上传请求

@WebServlet("/upload2")
public class FileUploadServlet2 extends HttpServlet {

    private static final String UPLOAD_DIRECTORY = "/tmp";

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

        PrintWriter out = response.getWriter();

        // 检查是否为文件上传请求
        if (!ServletFileUpload.isMultipartContent(request)) {
            out.println("请求不支持文件上传");
            return;
        }

        // 获取上传目录路径
        String uploadPath = getServletContext().getRealPath("") + File.separator + UPLOAD_DIRECTORY;
        File uploadDir = new File(uploadPath);
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        // 最大文件上传大小限制,单位为MB
        int fileSizeThreshold = 1024 * 1024 * 10;
        int maxFileSize = 1024 * 1024 * 50;

        // 配置文件上传处理器
        DiskFileItemFactory factory = new DiskFileItemFactory();
        factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
        factory.setSizeThreshold(fileSizeThreshold);
        ServletFileUpload fileUpload = new ServletFileUpload(factory);
        fileUpload.setFileSizeMax(maxFileSize);

        List<FileItem> formItems = null;
        try {
            formItems = fileUpload.parseRequest(request);
        } catch (FileUploadException e) {
            out.println("文件上传失败,原因是:" + e.getMessage());
            return;
        }

        // 处理上传文件
        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 uploadFile = new File(filePath);

                    try {
                        item.write(uploadFile);
                        out.println("文件上传成功,保存路径为:" + filePath);
                    } catch (Exception e) {
                        out.println("文件上传失败,原因是:" + e.getMessage());
                    }
                }
            }
            out.println("<a href='index.jsp'>返回首页</a>");
        } else {
            out.println("请选择上传文件!");
        }
    }
}

在该Servlet中,我们首先检查请求是否为文件上传请求,如果不是则直接返回。然后,我们通过ServletFileUpload类解析请求中的文件,并将文件写入到指定的目录中。

需要注意的是,我们在配置ServletFileUpload对象时,使用了Apache在文件上传方面提供的一些配置,比如FileSizeMax、Repository等等。

3.3. 创建文件上传页面

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>文件上传</title>
</head>
<body>
    <form action="${pageContext.request.contextPath}/upload2" enctype="multipart/form-data" method="post">
        <input type="file" name="file"/>
        <input type="submit" value="上传"/>
    </form>
</body>
</html>

3.4. 测试

上传完成后,可以在磁盘上查看上传文件是否保存成功。在浏览器中打开上传页面,选择一个文件,单击“上传”按钮,上传完成后成功提示信息会显示在页面上。

以上就是使用JSP实现文件上传功能的完整攻略,希望可以帮助到你。

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

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

相关文章

  • Java实现顺序表的操作详解

    Java实现顺序表的操作详解 顺序表又称为动态数组,是一种顺序存储的线性结构。在一个一维数组的物理空间中依次存放线性表的各个元素,通常使用分配一段连续的存储空间来存储。本文将详细讲解Java实现顺序表的操作,包括构建、插入、删除、查找等。 初始化顺序表 在Java中,我们使用数组来存储顺序表,因此初始化顺序表即为创建一个数组并分配相应的存储空间。在这里我们先…

    Java 2023年5月26日
    00
  • JavaSpringBoot报错“NoClassDefFoundError”的原因和处理方法

    当使用Java的Spring Boot框架时,可能会遇到“NoClassDefFoundError”错误。这个错误通常是由以下原因之一引起的: 缺少依赖项:如果您的应用程序缺少依赖项,则可能会出现此错误。在这种情况下,需要确保所有依赖项都已正确添加。 类路径错误:如果类路径错误,则可能会出现此错误。在这种情况下,需要确保类路径正确。 以下两个实例: 例 1 …

    Java 2023年5月5日
    00
  • Java8新特性之lambda(动力节点Java学院整理)

    Java8新特性之lambda——完整攻略 什么是lambda表达式 lambda表达式是一种能够传递行为的对象,是一个匿名函数,它没有名称、修饰符和返回类型,但是它可以像方法一样接受参数和返回值,并且可以被赋值给一个变量,它是Java8中一个非常重要的特性。 lambda表达式的语法 lambda表达式的语法如下: (parameter) -> ex…

    Java 2023年5月26日
    00
  • PHP扩展之kafka安装应用案例详解

    PHP扩展之kafka安装应用案例详解 介绍 Kafka是一个高性能、可扩展、分布式消息引擎系统。本文将介绍PHP扩展Kafka的安装和应用案例。 安装 1. 安装librdkafka PHP扩展Kafka依赖于librdkafka库,需要先安装该库。 # 安装步骤 $ git clone https://github.com/edenhill/librdk…

    Java 2023年5月20日
    00
  • java登录验证码实现代码

    实现Java登录验证码的代码,可以使用Java的第三方开源框架Kaptcha。下面是详细步骤。 Kaptcha安装 下载jar包 在Kaptcha官网上下载最新的jar包。 导入jar包 将下载的jar包导入项目的Classpath路径下。 Kaptcha使用 添加JSP页面代码 在需要验证码的登录页面的form标签中添加如下代码: “`html 验证码

    Java 2023年5月23日
    00
  • 关于Java 获取时间戳的方法

    关于Java获取时间戳的方法有很多种,这里主要介绍两种比较常用的方法。 方法一:使用System类的currentTimeMillis()方法 long timestamp = System.currentTimeMillis(); System类是Java的一个内置类,其中的currentTimeMillis()方法返回的是当前时间距离1970年1月1日0…

    Java 2023年5月20日
    00
  • java表单提交中文乱码的解决方法

    针对Java表单提交中文乱码的解决方法,我们可以从服务器和浏览器两个方面入手,以下是完整的攻略: 一、服务器端解决方案 1.1 设置请求编码与响应编码 在服务器端,我们可以通过设置请求编码和响应编码来解决Java表单提交中文乱码问题。 request.setCharacterEncoding("UTF-8"); response.setC…

    Java 2023年5月20日
    00
  • Java 编程之IO流资料详细整理

    Java 编程之IO流资料详细整理 什么是 IO 流 输入输出流(IO流)指的是一种提供了对数据流进行读写的机制,是 Java 中用于处理流数据的一种常用方式。在 Java 中,IO 流分为字节流和字符流两种方式,分别处理二进制数据和文本数据。 IO 流的分类 字节流 字节流是 IO 流中最基本的一种,主要用于处理二进制数据。Java 中的字节流有两个基本的…

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