Servlet实现文件上传的三种方法总结

Servlet实现文件上传的三种方法总结

介绍

文件上传是Web开发中常见的需求之一,可以通过Servlet实现。本文将总结Servlet实现文件上传的三种方法。

方法一:使用Apache的FileUpload

步骤:

  1. 下载Apache的FileUpload工具包,导入到项目中。
  2. 在Servlet中获取客户端上传的文件的输入流,然后使用FileItemFactory类和ServletFileUpload类分别解析和处理上传的文件。

示例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String path = context.getRealPath("/upload");
    String tempPath = context.getRealPath("/temp");
    String contentType = request.getContentType();
    if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
        DiskFileItemFactory factory = new DiskFileItemFactory();
        //设置缓冲区大小,超过缓冲区大小的文件将被写入磁盘
        factory.setSizeThreshold(4096);
        factory.setRepository(new File(tempPath));
        ServletFileUpload upload = new ServletFileUpload(factory);
        //设置文件上传大小限制
        upload.setSizeMax(4194304);
        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 filePath = path + "/" + fileName;
                    File uploadedFile = new File(filePath);
                    item.write(uploadedFile);
                }
            }
            response.getWriter().println("上传成功");
        } catch (Exception e) {
            response.getWriter().println("上传失败");
        }
    }
}

方法二:使用Commons IO库

步骤:

  1. 下载Commons IO库,导入到项目中。
  2. 在Servlet中获取客户端上传的文件的输入流,然后使用FileUtils类将上传的文件保存到指定路径。

示例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String path = context.getRealPath("/upload");
    String tempPath = context.getRealPath("/temp");
    File tempFile = new File(tempPath);
    if (!tempFile.exists()) {
        tempFile.mkdir();
    }
    String contentType = request.getContentType();
    if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
        try {
            DiskFileItemFactory factory = new DiskFileItemFactory();
            //设置缓冲区大小,超过缓冲区大小的文件将被写入磁盘
            factory.setSizeThreshold(4096);
            factory.setRepository(tempFile);
            ServletFileUpload upload = new ServletFileUpload(factory);
            //设置文件上传大小限制
            upload.setSizeMax(4194304);
            List<FileItem> items = upload.parseRequest(request);
            for (FileItem item : items) {
                if (!item.getName().equals("")) {
                    //获取上传的文件名
                    String fileName = item.getName();
                    fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
                    String filePath = path + "/" + fileName;
                    File uploadedFile = new File(filePath);
                    //将上传的文件保存到指定路径
                    FileUtils.copyInputStreamToFile(item.getInputStream(), uploadedFile);
                }
            }
            response.getWriter().println("上传成功");
        } catch (Exception e) {
            response.getWriter().println("上传失败");
        }
    }
}

方法三:使用Java的IO API

步骤:

  1. 在Servlet中获取客户端上传的文件的输入流,然后通过Java的IO API将上传的文件保存到指定路径。

示例:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext context = this.getServletContext();
    String path = context.getRealPath("/upload");
    File file = new File(path);
    if (!file.exists()) {
        file.mkdir();
    }
    String contentType = request.getContentType();
    if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0)) {
        try {
            DataInputStream dis = new DataInputStream(request.getInputStream());
            //根据长度创建字节数组,并将数据读入数组中
            byte[] buffer = new byte[2048];
            int length = dis.read(buffer);
            while (length > 0) {
                String fileName = new String(buffer, 0, length);
                fileName = fileName.substring(fileName.indexOf("filename=\"") + 10);
                fileName = fileName.substring(0, fileName.indexOf("\n"));
                fileName = fileName.substring(fileName.lastIndexOf("\\") + 1, fileName.indexOf("\""));
                String filePath = path + "/" + fileName;
                byte[] buf = new byte[2048];
                int len = 0;
                FileOutputStream fos = new FileOutputStream(filePath);
                while ((len = dis.read(buf)) != -1) {
                    fos.write(buf, 0, len);
                }
                fos.close();
                response.getWriter().println("上传成功");
            }
        } catch (Exception e) {
            response.getWriter().println("上传失败");
        }
    }
}

总结

以上就是Servlet实现文件上传的三种方法,其中使用Apache的FileUpload和Commons IO库相对比较方便和快捷,推荐使用;而使用Java的IO API则要繁琐一些,不建议使用。在使用时,还需要注意设置文件上传大小限制,防止恶意攻击。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Servlet实现文件上传的三种方法总结 - Python技术站

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

相关文章

  • Spring Boot+AngularJS+BootStrap实现进度条示例代码

    Spring Boot+AngularJS+BootStrap实现进度条示例代码 在本文中,我们将详细讲解如何使用Spring Boot、AngularJS和BootStrap实现进度条示例代码。我们将介绍两个不同的示例,以说明如何使用这些技术来实现进度条。 示例一:使用AngularJS和BootStrap实现进度条 在这个示例中,我们将使用Angular…

    Java 2023年5月18日
    00
  • java 排序算法之选择排序

    Java 排序算法之选择排序 选择排序(Selection Sort)算法是一种简单直观的排序算法,它的基本思路是在未排序序列中找到最小元素,然后将其存放到序列的起始位置,然后再从剩余未排序的序列中继续寻找最小元素,存放到已排序序列的末尾。以此类推,直到全部元素均排序完成。 排序过程 以从小到大排序为例,选择排序的一次过程如下: 从待排序的序列中,找到关键字…

    Java 2023年5月19日
    00
  • 你可能真没用过这些 IDEA 插件(建议收藏)

    当提到Java开发的工具中,IntelliJ IDEA是无疑是许多开发者首选的IDE。除了强大的功能之外,IDE在安装插件后可以帮助我们更快速的开发,提高工作效率。在本篇攻略中,我将介绍一些我平常在IDEA中常用的插件,并提供一些示例。 一、安装插件 安装插件非常简单,只需要打开IDEA选项,然后点击插件,再找到Marketplace页面,在这里面你能找到很…

    Java 2023年5月26日
    00
  • JSP页面中如何用select标签实现级联

    要在JSP页面中使用select标签实现级联,可以遵循以下步骤: 确定级联关系 在使用select标签实现级联前,需要确定级联关系,即第一个下拉框的选择决定了第二个下拉框的选项。例如,第一个下拉框选择区域,第二个下拉框选择该区域的城市。 创建第一个下拉框 使用HTML的select标签创建第一个下拉框,并给每个选项赋值。例如,在第一个下拉框里,我们可以创建几…

    Java 2023年6月15日
    00
  • 线程局部变量的作用是什么?

    以下是关于线程局部变量的作用的完整使用攻略: 线程局部变量的作用 线程局部变量是指在多线程编程中,每个线程都拥有自己的变量本,互不干扰的一种变量。线程局部变量可以用来存储线程的状态信息,从而实现线程之间的数据隔离和共享。 线程局部变量的作用主要有以下几个方面: 1. 实现线程之间的数据隔离 在多线程编程中,线程之间的数据隔离是非常重要的。线程局部变量用来存储…

    Java 2023年5月12日
    00
  • Java 数据库连接池DBPool 介绍

    Java 数据库连接池DBPool 介绍 什么是数据库连接池 在Java中,如果我们要通过jdbc来操作数据库,需要先建立与数据库的连接。而在多线程环境下,如何高效地管理这些连接,又如何防止频繁地打开和关闭连接,这就需要数据库连接池来实现了。 数据库连接池,简单来说就是提前初始化一定数量的数据库连接,然后将这些连接放在一个队列中,当需要连接数据库时,直接从池…

    Java 2023年5月20日
    00
  • 扒一扒 Java 中的枚举类型

    当我们需要定义一些常量时,在 Java 中使用枚举类型是一个很好的选择。Java 中的枚举类型与其他编程语言不同,它是类的一种特殊形式,可以包含方法和属性。接下来,我们将详细讲解如何使用枚举类型。 创建枚举类型 在 Java 中,创建枚举类型非常简单。只需要使用 enum 关键字,然后在一对大括号中定义枚举常量即可。例如: public enum Weekd…

    Java 2023年5月26日
    00
  • 使用dynamic datasource springboot starter实现多数据源及源码分析

    下面我们来详细讲解使用dynamic datasource springboot starter实现多数据源及源码分析的完整攻略。 什么是dynamic datasource springboot starter? dynamic datasource springboot starter是一款基于spring boot的多数据源解决方案,可以支持动态添加和…

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