【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. iOS项目的本地化处理(多国语言)
  2. Oracle 11g密码过期问题及解决方案
  3. javascript小数四舍五入
  4. Windows环境下32位汇编程序设计C版code--第五章(二)
  5. 小程序渲染html的两种方法
  6. xp精简工具_Windows10你也可以精简优化,丝滑般极爽轻松做到,再也不卡了
  7. vista 中php4, php5 共存
  8. ajax和rxjs,javascript – RxJS 5 Observable和Angular2 http:调用ajax一次,保存结果,随后的ajax调用使用缓存结果...
  9. TypeError: cannot unpack non-iterable NoneType object
  10. finditerable 转list_Iterable/Iterator 转 list
  11. 1.4通过时间的方向传播
  12. matlab 复频谱图,基于MATLAB实现连续信号与系统复频域分析
  13. php 判断下载状态,php下载文件显示进度(适用于CLI模式或长连接)
  14. ParticleEditor粒子编辑器
  15. ArcGIS影像空值填充\插补
  16. MTK改串工具,mtk刷机工具,高通刷机工具,MTK生成线刷包工具资料下载
  17. navicat导入.mdf文件到远程sqlserver数据库
  18. MSTAR雷达数据集总结
  19. android drawText()方法中x,y坐标值真正的 意义
  20. C++动态规划入门习题+解析

热门文章

  1. thunderbird with exchange 14.04
  2. 玩游戏计算机配置,小编详解玩游戏需要什么电脑配置
  3. 青橙商城 day09 前台
  4. 大一电赛:51单片机(状态机编程)——控制外部开关(继电器)达到自定义输出波
  5. ubuntu20.04安装kismet
  6. ShaderJoy —— 二维多光源光照阴影【GLSL】
  7. 简洁美观QQ在线客服漂浮窗口代码
  8. 基于graph的图像分割算法:Efficient Graph-Based Image Segmentation
  9. 炸鸡店服务员入行月薪2W,为什么Python岗位薪资越来越高?零基础从哪里开始学?一文全解
  10. MYSQL MGR复制模式