【SpringBoot项目实战】图片压缩包上传、解压、存储等等一套流程教学

news2024/11/17 13:32:10

【SpringBoot项目实战】图片压缩包上传、解压、存储等等一套流程教学

  • 前言
  • 一、压缩包上传
    • 1、接口实现
    • 2、获取压缩包的文件名和文件路径
  • 二、压缩包解压并保存
    • 1、处理压缩包文件方法
      • 解压缩步骤:
    • 2、接口中实现处理压缩包
  • 三、总结


前言

之前一直用的zip4j来对压缩包进行操作,但后来发现Hutool里面也有ZipUtil,ZipUtil是对 java.util.zip 做工具化封装

操作起来大同小异,改成了Hutool的ZipUtil,这样就少引用了一个依赖。

相关工具:Hutool 压缩工具-ZipUtil (点击跳转)


一、压缩包上传

1、接口实现

在Class上加上**@RestController** 标注此类为控制器类

@PostMapping(“/upload”) 标注此方法访问路径为"/upload",访问方法是POST

这边接口接收的内容类型 Content-Typemultipart/form-data,这边接收时会自行根据参数进行判断

@RequestParam(“zipFile”) 注解用来获取 zipFile 字段中对应的内容

首先,先实现一个用于上传文件的post接口,代码如下:

@RestController
public class Controller {

	/**
    * 压缩包文件上传
    *
    * @param zipFile 压缩包文件
    * @return R 返回实体类
    */
    @PostMapping("/upload")
    public R upload(@RequestParam("zipFile") MultipartFile zipFile) {
    	//TODO
    	return R.success();
    }
}

这边上传URL默认为:http://127.0.0.1:8080/upload

2、获取压缩包的文件名和文件路径

这边使用 @Value 注解获取配置文件 application.yml 的上传路径 config.uploadPath 的值

在Class上别忘了加上 @Component 注解进行组件扫描,这样才能获取到配置文件中的上传路径 uploadPath

上传文件的接收参数类型为 MultipartFile

代码如下:

//组件骚猫注解,用于获取配置文件内容
@Component
@RestController
public class Controller {
	
	//获取配置文件中的文件上传物理路径,例:C:/
    @Value("${config.uploadPath}")
    private String uploadPath;

	/**
    * 压缩包文件上传
    *
    * @param zipFile 压缩包文件
    * @return R 返回实体类
    */
    @PostMapping("/upload")
    public R multiFace(@RequestParam("zipFile") MultipartFile zipFile) {
    	//获取文件全名
    	String fileName = zipFile.getOriginalFilename();
    	//解压目标文件夹对象(压缩文件解压到此文件夹中)
    	File extractFolder = new File(uploadPath + "extract/");
		//压缩包存储目标文件对象
        File destFile = new File(uploadPath + fileName);
        //文件上传路径对象
        File fileDirectory = new File(uploadPath);
        //当上传路径不存在时,生成上传路径
        if (!fileDirectory.exists()) {
            fileDirectory.mkdirs();
        }
        //TODO
    	return R.success();
    }
}

二、压缩包解压并保存

1、处理压缩包文件方法

解压缩步骤:

  1. 将上传的压缩包保存至文件夹
  2. 解压文件夹中的压缩包到指定目录
  3. 获取该目录中所有文件的文件数组对象

代码如下:

    /**
     * 处理压缩包文件
     *
     * @param zipFile       上传压缩包
     * @param destFile      指定压缩包路径
     * @param extractFolder 解压后文件夹
     * @return R 返回实体类
     */
    private R dealZip(MultipartFile zipFile, File destFile, File extractFolder) {
    	//判断解压后文件夹是否存在
        if (!extractFolder.exists()) {
        	//不存在就创建
            extractFolder.mkdirs();
        }
        try {
        	//步骤1、把上传的压缩包文件保存到指定压缩包路径
            zipFile.transferTo(destFile);
        } catch (IOException e) {
        	//运行报错直接返回错误信息
            return R.failed(e.getMessage());
        }
        //步骤2、调用Hutool的ZipUtil压缩工具类的unzip方法来进行对压缩包文件的解压,解压到指定目录
        ZipUtil.unzip(destFile, extractFolder);
        //解压缩完删除原文件(可不删)
        destFile.delete();
        //步骤3、获取解压后目录下所有的文件
        File[] images = extractFolder.listFiles();
        //这边对获取到的文件数组进行判空校验
        if (images == null || images.length == 0) {
        	//不存在就把压缩文件夹删除(可不删)
            extractFolder.delete();
            return failed("上传失败,压缩包为空");
        }
        //错误文件集合
        List<String> nameList = new ArrayList<>();
        //这边简单做个jpg图片校验,单个文件全名中不包含jpg的文件添加到错误集合中
        stream(images).forEach(image -> {
            if (!image.getName().contains("jpg")) {
                nameList.add(image.getName());
            }
        });
        //错误集合存在数据就返回错误的文件名集合
        if (nameList.size() > 0) {
        	//存在错误图片就把压缩文件夹删除(可不删)
            extractFolder.delete();
            return failed("压缩包文件错误,错误文件如下:" + nameList + ",请修改后再上传");
        }
        //错误集合长度为0时返回解压后文件数组对象
        return success(images);
    }

2、接口中实现处理压缩包

代码如下:

//组件骚猫注解,用于获取配置文件内容
@Component
@RestController
public class Controller {
	
	//获取配置文件中的文件上传物理路径,例:C:/
    @Value("${config.uploadPath}")
    private String uploadPath;

    //Service层
    @Resource
    private Service service;
	
	/**
    * 压缩包文件上传
    *
    * @param zipFile 压缩包文件
    * @return R 返回实体类
    */
    @PostMapping("/upload")
    public R multiFace(@RequestParam("zipFile") MultipartFile zipFile) {
    	//获取文件全名
    	String fileName = zipFile.getOriginalFilename();
    	//解压目标文件夹对象(压缩文件解压到此文件夹中)
    	File extractFolder = new File(uploadPath + "extract/");
		//压缩包存储目标文件对象
        File destFile = new File(uploadPath + fileName);
        //文件上传路径对象
        File fileDirectory = new File(uploadPath);
        //当上传路径不存在时,生成上传路径
        if (!fileDirectory.exists()) {
            fileDirectory.mkdirs();
        }
        //调用上面【处理压缩包文件方法】得到返回结果
		R zipResult = dealZip(zipFile, destFile, extractFolder);
		//失败就返回错误信息
        if (FAIL_CODE == zipResult.getCode()) {
            return zipResult;
        }
        //获取【处理压缩包文件方法】中返回的图片文件数组对象
        File[] images = (File[]) zipResult.getData();
        //实体类集合
        List<Entity> entities = new ArrayList<>();
        //这边使用stream对图片文件数组对象进行遍历
        stream(images).forEach(image -> {
        	//TODO 这边可以做其他的处理
        	//这边简单的获取了照片名字的前缀作为id
            String id = image.getName().split("\\.")[0];
            //通过数据库找找此id的信息
            Entity entity = service.getById(id);
            if (entity != null) {
            	//存在此条信息就把此图片拷贝到上传目录中,这边用到Hutool的FileUtil文件工具类的copy文件拷贝方法
                FileUtil.copy(image, new File(uploadPath + image.getName()), true);
                //存在就添加进实体类集合
                entities.add(entity);
            }
        });
        //实体类为空代表在数据库中没有找到对应id的信息
        if (entities.size() == 0) {
        	//删除解压缩目录(可不删)
            extractFolder.delete();
            return failed("压缩包内图片无匹配信息");
        }
        //删除解压缩目录(可不删)
        extractFolder.delete();
        //最后数据库根据id更新所有集合实体类的信息
        return service.updateBatchById(entities) ? 
        	success("压缩包上传成功") : 
        	failed("压缩包上传失败");
    }
}

三、总结

这边项目主要应用是上传人脸的照片压缩包

解压缩后,根据照片的名称前缀为人员id来进行保存

压缩包遍历中可以按照业务需求进行文件区分再进行其他操作

这些年程序员生涯,发现网上一些解决方案很少有完整的

都是零零散散的,查起来特别费劲,所以自己写解决方案会尽量要求写完整

方便自己也方便别人

感谢您能看完本篇内容

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/128848.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开源项目推荐 | 中科院自动化所历时9年打造的类脑认知智能引擎“智脉”正式开源部署至OpenI启智社区

​人脑能够自组织地协同数百项认知功能&#xff0c;灵活适应复杂多变的环境。如何整合多尺度生物可塑性法则来构建具有生物合理性和计算高效性的神经网络模型是类脑人工智能和计算神经科学领域共同关注和面临的重要挑战。 中国科学院自动化研究所类脑认知智能研究组历时9年&am…

通关算法题之 ⌈动态规划⌋

动态规划 动态规划是什么&#xff1f;解决动态规划问题有什么技巧&#xff1f;如何学习动态规划&#xff1f; 首先&#xff0c;动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法&#xff0c;只不过在计算机问题上应用比较多&#xff0c;比如说让你求…

蓝桥杯寒假集训第二天(分巧克力)

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目描述&#xff1a; 有很多的巧克力块&#xff0c;需要设计一个程序&#xff0c;让手艺师傅切出来的巧克力既满足切出来的巧克力的份数达到客户要求的份数&#xff0c;并且切出来的巧克力块尽…

硬盘图片丢失怎么办?看看这常见的三种恢复方法

电脑硬盘能够帮助我们存储各种各样的数据&#xff0c;比如图片数据&#xff0c;而随着这些充满回忆的图片积累的越来越多&#xff0c;难免会手误删除或其他原因导致丢失&#xff0c;那么对于电脑硬盘上丢失的图片如何恢复呢&#xff1f;在这里你可以了解到硬盘图片丢失常见原因…

python—subprocess模块常用方法介绍

目录 subprocess.run() subprocess.Popen() subprocess.call() subprocess.check_call() subprocess.getstatusoutput() subprocess.getoutput() subprocess.check_output() subprocess是子流程&#xff0c;即进程的意思&#xff0c;该模块可以启动一个新进程&#xff0…

印度电线标准IS 694(R2020),印度插头标准IS 1293(R2020)

印度电线标准IS 694&#xff08;R2020) https://download.csdn.net/download/std86021/87328675POLYVINYLCHLORIDEINSULATEDUNSHEATHEDANDSHEATH更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/std86021/87328675 补丁一&#xff1a;IS694Amd…

已获1000 万美元战略融资,Web3链游#Delysium 有何魔力?

这周社区推文关注了AIGC在游戏领域中的创新应用&#xff0c;在Web3领域中&#xff0c;有哪些值得关注的链游项目呢&#xff1f;Mixlab小杜AIGC 与游戏机制创新玩法结合已成为潮流趋势&#xff0c;如游戏内容资产生成、智能NPC设计与自定义游戏玩法等都有非常大的探索空间。Web3…

【ACWING】【BFS】【844走迷宫】【845八数码】

一、走迷宫 给定一个 nm的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0 或 1&#xff0c;其中 0表示可以走的路&#xff0c;1 表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1)处&#xff0c;已知该人每次可以向上、下、左、右任意一…

CVE复现1

1 CVE-2022-22980 spring Data MongoDB SpEL 表达式注入,Spring Data MongoDB应用程序在对包含查询参数占位符的SpEL表达式使用Query或Aggregation注解的查询方法进行值绑定时&#xff0c;如果输入未被过滤&#xff0c;则容易受到SpEL注入攻击。 影响范围 Spring Data Mongo…

190:vue+openlayers 调整卫星运动的播放速度,展示运动轨迹

第190个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中利用两行根数计算卫星在某一时刻的位置点,利用时间循环,定位出不同的位置,呈现动画的效果。文中利用slider的改变来确定当前时间为开始时间,slider的值为加速倍数,每个setTimeout为10毫秒,更新…

【博客系统】前端页面

博客系统 实现一个简单的博客系统。 当前先完成页面设计部分&#xff0c;通过学习的前端知识来构建出网页。 主要分成四个部分&#xff1a; 博客列表页博客正文页博客登陆页博客编辑页 预期效果 博客列表页效果 博客详情页效果 博客登陆页效果 博客编辑页效果 实现博客列…

C++数据结构--跳表的思想--手把手教你实现跳表--0721

1、 跳表--skiplist skiplist本质上是一种查找结构&#xff0c;跟平衡搜索树和哈希表的价值是一样的。跳表首先是一个链表&#xff0c;它是在链表的基础上发展的。但一般的链表进行查找数据只能全部遍历&#xff0c;时间复杂度为O(n)。 William Pugh的优化&#xff1a; 假如每…

Kafka一次线上问题

线上问题&#xff1a; Kafka: 客户说Broker不时会发生些错误日志&#xff0c;也看到topic的tps下降很快很明显&#xff0c; 日志看是ISR在不断的伸缩&#xff0c; 监控发现发生问题时的CPU、IO、磁盘都没有瓶颈 再查看堆栈信息&#xff1a;可看到关键信息&#xff1a; 有锁…

R语言raster包批量读取单一或大量栅格图像

本文介绍基于R语言中的raster包&#xff0c;读取单张或批量读取多张栅格图像&#xff0c;并对栅格图像数据加以基本处理的方法。 1 包的安装与导入 首先&#xff0c;我们需要配置好对应的R语言包&#xff1b;前面也提到&#xff0c;我们这里选择基于raster包来实现栅格图像数据…

TestStand-单执行界面

文章目录用户界面运行流程例程创建前面板设置用户界面主窗口前面板控件配置用户事件用户界面运行流程 用户界面设计的基本元素&#xff1a;管理控件、可视化控件、连接、应用程序启动及关闭、注册事件、处理事件。 LabVIEW中通过Regesiter Event Callback注册事件。 LabVIEW-Te…

flink内存管理, 增加Task内存大小,减少ManageMemory, network内存的方法

问题描述 flink默认分配的内存&#xff0c;不合理&#xff0c;jvm 堆内存太小&#xff0c;其他内存太大。向yarn申请8G内存&#xff0c;最后分配到heap的大小才3.2G&#xff0c;不是让人抓狂吗&#xff1f; 以上是&#xff0c;向yarn申请8G内存&#xff0c;实时分配的内存是上…

“破壁者”氚云,打破低代码之困

互联网云大厂的“火”已经烧红了低代码领域的半边天。 自低代码在国内盛行以来&#xff0c;尤其是时至2022年末&#xff0c;阿里、腾讯、华为等云大厂的跑马圈地仍如火如荼&#xff0c;动作密集程度堪比机关枪。 面对日益增长的企业数字化业务需求&#xff0c;产品经理只需少…

编译器设计(十三)——指令调度

一、简介 对程序块或过程中的操作进行排序以有效利用处理器资源的任务称为指令调度&#xff08;instruction scheduling&#xff09;。调度器的输入是由目标机汇编语言操作组成的一个部分有序的列表&#xff0c;输出是同一列表的一个有序版本。 一组指令的执行时间严重依赖于…

什么是云存储?有什么优势?

在云计算中&#xff0c;用户将数据保存在远程位置。它可以通过互联网连接访问&#xff0c;而不是在本地或物理上(在硬盘上)访问。而云存储成为最实用有效的方式之一。它有助于在线存储数据。 什么是云存储? 云存储是指安全、全局和可扩展的数据存储。它用于存储不可变数据&…

智慧工厂的大脑——APS生产排程系统

生产计划排程是生产管理中的核心工作&#xff0c;或许很多人不同意这个观点&#xff0c;只是因为这个观点的前提是生产计划排程在生产管理中真正起到了作用&#xff0c;目前国内制造业的现状还不能体现出生产计划排程的真正作用&#xff0c;所以也没有人认为它是最核心的工作&a…