【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) {//TODOreturn 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();}//TODOreturn 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层@Resourceprivate 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 这边可以做其他的处理//这边简单的获取了照片名字的前缀作为idString 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来进行保存

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

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

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

方便自己也方便别人

感谢您能看完本篇内容

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

  1. SpringBoot 项目将文件图片资源上传到本地静态资源文件夹下(指定文件夹下)

    1.SpringBoot 项目将文件图片资源上传到本地静态资源文件夹下(指定文件夹下) 最终效果: 前端浏览本地文件,点击上传至本地resources/static/images/imgWall下 2 ...

  2. SpringBoot项目使用EasyExcel读取上传Excel

    SpringBoot项目使用EasyExcel读取上传Excel 1.EasyExcel简介 EasyExcel是一个基于Java的简单.省内存的读写Excel的开源项目.在尽可能节约内存的情况下支持 ...

  3. 一款动态跑路html源码,简单实用,上传解压就完事了

    介绍: 一款动态跑路源码,简单实用,上传解压就完事了 搭建教程: 1.领取主机 2.二级域名 3.上传源码到主机文件夹,解压 4.绑定域名,搭建完成 网盘下载地址: http://kekewangLu ...

  4. Java springboot压缩文件上传,解压,删除压缩包

    1. 配置文件 在application.yml里 file-server:path: \material-main\# 自己随便命名.注意,不管windows还是linux,路径不需要带盘符,用代码 ...

  5. SpringBoot项目Docker化并上传DockerHub的使用过程

    . springboot项目 docker化 添加依赖 代码片段:<plugin><groupId>com.spotify</groupId><artifac ...

  6. SpringBoot 图片压缩包上传、解压、存储等

    import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.ZipUtil; import cn.hutool.http.HttpRe ...

  7. 解决springboot项目部署时视上传视频太大导致的内存溢出问题

    在项目部署时输入命令java -Xms512m -Xmx1024m -jar 项目名.jar

  8. java 预览zip_java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载

    java压缩包上传,解压,预览(利用editor.md和Jstree实现)和下载 实现功能:zip文件上传,后台自动解压,Jstree树目录(遍历文件),editor.md预览 采用Spring+Sp ...

  9. 项目实战|史上最简单的springboot 整合elk教程,实现日志收集(带视频哦)

    配套视频教程已经上传 整合ELK-实现日志收集(知乎) 整合ELK-实现日志收集(CSDN) 项目源码已上传至 https://gitee.com/yangleliu/learning.git,免费索 ...

最新文章

  1. 2022-2028年中国香精香料行业投资分析及前景预测报告
  2. 网络计算机统考报名网,2017年《计算机应用基础》统考试题及答案
  3. Eclipse 启动问题:'Initilizing Java Tooling' has encountered a problem(。。。)
  4. java开发后台技术_java开发后台的技术
  5. 动态规划——硬币找零和币值最大化问题
  6. Java设计模式之行为型:备忘录模式
  7. 【转载】我心目中最好的框架组合是
  8. js php 时间格式化字符串,JS怎么实现字符串与日期的互相转换及日期的格式化
  9. 接口 Swagger 部分Web API的隐藏
  10. Adobe illustrator 拼图模板制作 - 连载21
  11. python的scapy_Python Scapy vs dp
  12. 支付宝封杀比特币,可以说是毫不留情!
  13. 心痛!常德网约车司机遇害 滴滴回应:已成立应急处置小组
  14. elementui el-upload 删除指定文件
  15. 大家一般用什么工具测试HTTP和json接口?
  16. TensorFlow:判断CUDA和GPU是否可用
  17. OPENCV轮廓提取findContours和drawContours
  18. Mac-录屏软件-视频转gif动图
  19. 基于snowflake的序列号生成器
  20. VMware Workstation报错:cpu-0:VERIFY vmcore/vmm/main/cpuid.c:386 bugNr=1036521

热门文章

  1. WebApp开发框架①
  2. Extjs中grid 的ColumnModel 属性配置和常用方法及实例
  3. 万千宠爱于一身----林志玲经典语录
  4. 计算机无法识别佳能5d2,计算机无法识别所有的Usb设备
  5. 了解css3属性transform
  6. [置顶] 当前上下文不存在 ScriptManager 的原因分析以及解决方案 (System.Web.Extensions)...
  7. 关于治疗便秘的方法 - 生活至上,美容至尚!
  8. 开学季好物推荐、开学必备实用好物推荐排行榜
  9. PV操作实现进程同步问题
  10. 域起网络携手几维安全,护航互联网游戏业务安全