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日

相关文章

  • Java如何实现定时任务

    Java中实现定时任务的方式有多种,主要包括使用Timer和TimerTask类、使用ScheduledExecutorService接口、使用cron表达式和使用Quartz框架。 使用Timer和TimerTask类 Timer是一种简单的任务调度器,用于按照指定的时间间隔执行任务。TimerTask是Timer中的任务,可以继承TimerTask类并重…

    Java 2023年5月26日
    00
  • Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例

    下面我来详细讲解一下“Spring Data Jpa+SpringMVC+Jquery.pagination.js实现分页示例”的完整攻略。 1. 环境准备 首先,我们需要准备好以下环境: JDK 1.8 Spring Boot 2.3.4.RELEASE Spring Data JPA 2.3.4.RELEASE MySQL 8.0.21 Maven 3.…

    Java 2023年5月20日
    00
  • 什么是Java运行期注解?

    Java运行期注解是一种Java编程语言中的注解,在运行时可以对程序进行动态的注解处理。使用Java运行期注解可以提高代码的可读性、可维护性和可扩展性。 使用Java运行期注解的步骤如下: 1.定义注解 在Java中,可以通过编写类来定义注解,在这个类中定义的属性就成为了注解的成员变量。下面是一个示例注解: @Retention(RetentionPolic…

    Java 2023年5月11日
    00
  • 一文带你了解Java排序算法

    一文带你了解Java排序算法 在计算机科学中,排序算法是一种将一组数据按照特定规则进行排列的过程。Java中提供了多种排序算法实现,本文将为您介绍常见的排序算法及其实现方式。 冒泡排序 冒泡排序是一种基本的排序算法,通过重复遍历要排序的列表来比较相邻的两个元素,如果顺序错误,则进行交换,直到没有任何交换发生为止。 public static void bub…

    Java 2023年5月19日
    00
  • Java程序生成Access文件代码实例

    下面我来详细讲解“Java程序生成Access文件代码实例”的完整攻略。 1. 确定操作需求 首先,我们要确定自己的操作需求。需要生成Access文件的具体表结构和数据要素是什么?这一环节是至关重要的,要确保对表结构和数据元素有清晰的把握。 2. 加载JDBC驱动 准备工作之后,我们需要加载JDBC驱动,以便向Access数据库发出连接请求。下面是使用JDB…

    Java 2023年5月20日
    00
  • Java毕业设计实战项目之在线服装销售商城系统的实现流程

    Java毕业设计实战项目之在线服装销售商城系统的实现流程 本文主要介绍Java毕业设计实战项目之在线服装销售商城系统的实现流程。该系统是一个基于Java Web技术实现的大型在线服装销售商城系统,功能包括用户注册登录、商品浏览、购物车、订单管理、在线支付等。 需求分析 在实现该系统之前,首先需要进行需求分析,具体内容包括: 系统所需功能:包括用户功能,商品功…

    Java 2023年5月24日
    00
  • 与众不同的 Java 日期格式化大全

    与众不同的Java日期格式化攻略 日期格式化是Java中常用的功能,也是Java日期操作中常见的一部分。本攻略将详细介绍Java日期格式化的概念、使用方法、常用代码和示例。 Java日期格式化概述 Java中日期格式化即是将日期类型转换为字符串类型。Java日期格式化主要使用的是SimpleDateFormat类。该类提供了很多方法可以将日期类型按照指定的格…

    Java 2023年5月20日
    00
  • Java向数据库插入中文出现乱码解决方案

    下面详细讲解一下“Java向数据库插入中文出现乱码解决方案”的完整攻略。 问题描述 在使用Java向数据库插入中文字符时,可能会出现乱码现象。这是由于Java和数据库之间的字符集不一致所导致的。 解决方案 解决方法有两种:修改Java代码或修改数据库配置。 方案一:修改Java代码 在Java代码中添加如下内容,用于指定字符集为UTF-8: String u…

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