首页 > 其他分享 >使用Servlet实现多文件上传

使用Servlet实现多文件上传

时间:2024-03-18 22:38:27浏览次数:35  
标签:文件 Servlet fileName savePath new 上传 filePart

  一位朋友最近在学习JavaWeb开发,开始学习多文件上传操作,他自己尝试着去网上看一些博客教程,能明白其中大概的思路,

还是让我和他说说,如何实现单文单件上传功能。我和他说了一下大致的思路与操作步骤,主要分为前端和后端两部分来实现多文件上传操作。

Servlet版本要求必须是3.0+。

后台Java代码实现思路:

.1.继承HttpServlet,重写doPost()方法;

.2.从请求对象中获取文件上传对象Parts;

注意:必须在servlet中添加@MultipartConfig注解

.3.获取文件相关信息,比如类型、大小,判断是否合法;

.4.拼接文件保存路径;

.5.获取文件对象的输入流和保存文件的输出流;

.6.读取文件内容并写入到输出流中;

.7.刷新输出流缓冲区。

说明:多文件上传的时候,判断文件类型和大小是否合法可以在一个循环中完成。然后上传的时候,在另外一个循环中完成。如果有一个文件上传失败,则终止后面的文件上传。如果逻辑更加严谨一些,一次多文件上传操作失败之后,比如上传5个文件,前面三个成功,后面两个失败,是需要删除前两三个已经成功了的文件的。

前端html实现思路:

.1.创建html页面,编写form表单;

.2.设置form表单的请求方法为post方法;

.3.设置form表单的enctype属性值为"multipart/form-data";

.4.添加input标签,属性type设置为file;accept属性设置为accept=".png,.jpg",里面具体的值设置为想要上传的文件后缀名即可(可选)。

.5.在input标签中添加multiple属性,表示多文件上传。

 

后端示例代码实现如下:

// 注意:必须在servlet中添加@MultipartConfig注解

@MultipartConfig

@WebServlet("/uploadOne")

public class UploadFileOne extends HttpServlet {

 

    private final static String UPLOAD_PATH = "D:\\JavaWorkSpace\\course2024\\maven-demo\\src\\main\\webapp\\";

    private final static List<String> FILE_TYPE = Arrays.asList(".jpg", ".png", ".gif");

 

    private final static Long FILE_MAX_SIZE = 4 * 1024 * 1024L;

 

    // 1.继承HttpServlet,重写doPost方法

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 2.从请求对象中获取文件上传对象Part

        Collection<Part> parts = req.getParts();

        String fileName;

        for(Part filePart : parts){

            fileName = filePart.getSubmittedFileName();

            String fileType = fileName.substring(fileName.lastIndexOf("."));

            // 3.获取文件相关信息,比如类型、大小,判断是否合法

            System.out.println("fileType--->" + fileType);

            if(!FILE_TYPE.contains(fileType)){

                CommonResult.failed(resp,"文件类型错误");

                return;

            }

            System.out.println("size--->" + filePart.getSize());

            if(filePart.getSize() > FILE_MAX_SIZE){

                CommonResult.failed(resp,"文件大小超过4M");

                return;

            }

            System.out.println("fileName--->" + fileName);

        }

 

        String savePath = null;

        for(Part filePart : parts){

            // 4.拼接文件保存路径

            savePath = UPLOAD_PATH + filePart.getSubmittedFileName();

            System.out.println("savePath--->" + savePath);

 

            // 5.获取文件对象的输入流和保存文件的输出流

            try(BufferedInputStream bis = new BufferedInputStream(filePart.getInputStream());

                BufferedOutputStream bos = new BufferedOutputStream((new FileOutputStream(savePath)));

            ){

                byte[] buffer = new byte[1024];

                int len;

                // 6.读取文件内容并写入到输出流中

                while ((len = bis.read(buffer)) != -1) {

                    bos.write(buffer, 0, len);

                }

                // 7.刷新输出流

                bos.flush();

            } catch (Exception e){

                throw new RuntimeException("多文件上传失败");            }

        }

        CommonResult.success(resp,"上传完成");

    }

}

前端示例代码如下:

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <title>Title</title>

</head>

<body>

  <form action="./upload" method="post" enctype="multipart/form-data">

    <input type="file" name="file" accept=".png,.jpg" multiple/>

      <br>

    <input type="submit" value="上传" />

  </form>

</body>

</html>

最终测试效果如下,

测试方式一:可以直接在浏览器中先请求html页面,然后选择文件,测试上传。

 

 

 

测试方式二:使用调试工具,比如ApiFox;测试时非常方便,可以反反复复地进行测试文件上传操作,一直到文件上传正确为止(强烈推荐)。

 

 

至此:文件上传的功能全部完成。说明:Java代码中,在进行I/O流操作时,能使用带buffer缓冲区的类尽量使用,因为它的效率会高很多。参考博客:

https://blog.csdn.net/qq_32099833/article/details/109002715

标签:文件,Servlet,fileName,savePath,new,上传,filePart
From: https://www.cnblogs.com/yilangcode/p/18081612

相关文章

  • 使用Servlet实现单文件上传
    一位朋友最近在学习JavaWeb开发,开始学习单文件上传操作,他自己尝试着去网上看一些博客教程,能明白其中大概的思路,还是让我和他说说,如何实现单文单件上传功能。我和他说了一下大致的思路与操作步骤,主要分为前端和后端两部分来实现单文件上传操作。Servlet版本要求必须是3.0+。......
  • 读取设置密码保护的excel文件,有没有更好的办法?
    大家好,我是Python进阶者。一、前言前几天在Python最强王者交流群【wen】问了一个Python处理Excel加密文件读取问题。问题如下:请教:读取设置了密码保护的exlce文件,df=pd.read_excel(file,password='12345678') 报错:gotanunexpectedkeywordargument"password"  目前的解......
  • Git 仓库瘦身与 LFS 大文件存储
    熟悉Git的小伙伴应该都知道随着Git仓库维护的时间越来越久,追踪的文件越来越多,git存储的objects数量会极其庞大,每次从远程仓库gitclone的时候都会墨迹很久。如果我们不小心gitadd了一个体积很大的文件,且gitpush到了远程仓库,那么我们gitclone的时候也会很慢。看......
  • CentOS 执行sudo命令提示“XXX不在 sudoers 文件中“问题处理
    方法一:将用户添加到sudoers文件中定义的sudo组中切换到root用户,执行命令usermod-aGwheel,为要授予其权限的用户的名称使用su-命令切换到原来的用户(或使用reboot命令重启一下系统)。测试sudo访问权限,执行sudowhoami命令如果用户有sudo访问权限,该命令将打印“root”......
  • Java 文件处理完全指南:创建、读取、写入和删除文件详细解析
    Java文件操作文件处理简介文件处理是任何应用程序的重要部分。Java提供了许多用于创建、读取、更新和删除文件的方法。Java文件处理Java中的文件处理主要通过java.io包中的File类完成。该类允许我们处理文件,包括创建、读取、写入和删除文件。创建File对象要使用F......
  • kodbox读取alist文件失败,问题解决过程
    让我先把相关的报错信息通过文字贴到下方,方便被检索出来出错了!(warning!)curlerrorcode=403;系统错误(explorer.editor.fileGet)explorer/editor.class.php[64]IO::fileSubstr(0,1,2)bin/data.bin[2][Linux6.2.0-35-generic/8.2.11/mysqli/1.49.10]在使用kodbbox......
  • 注册Servlet的两种方式
    0.问题1.配置web.xml<servlet><servlet-name>servletTest</servlet-name><servlet-class>xxx</servlet-class><init-param><param-name>name</param-name><param-value>peter</param-value>......
  • 轻松搞定R语言“Warning:In normalizePath(path.expand(path), winslash, mustWork):文
    问题如下:初学R易语言在RStudio安装tidyverse包时,会出现如下警告;解决方法一:以Win11系统为例:1、右击此电脑,点击属性。2、点击高级设置。3、点击环境变量。4、新建用户变量。5、新建用户变量,设置变量名为R_User,变量值点览目录,选择RStudio安装目录,最后确定即可。6、......
  • 如何使用Python去除文件后缀名?
    简介在Python中,我们常常需要操作文件,包括文件的读取、写入、重命名等操作。在文件操作中,我们经常会遇到需要去除文件后缀的问题。那么,Python如何去除文件后缀呢?本文我们将介绍如何使用Python来去除文件后缀。去除文件后缀名的方法在Python中,去除文件后缀名有多种方法,我们将介绍......
  • Python实现:教你轻松统计文件夹下文件个数
    简介在日常的文件管理中,我们经常需要统计某个文件夹下文件的数量,这对于数据管理、文件清理等工作至关重要。Python作为一种强大而灵活的编程语言,提供了多种方法来实现这一目标。本文将介绍几种Python实现统计文件夹下文件个数的方法,并逐步解析它们的原理和用法。使用os模块Pyth......