⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 blog.csdn.net/qq_21609191 「愛彈吉他的小盆友」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

前言

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

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

相关工具:

www.hutool.cn/docs/#/core/工具类/压缩工具-ZipUtil

一、压缩包上传

1、接口实现

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

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

这边接口接收的内容类型 Content-Type 为 multipart/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、处理压缩包文件方法

解压缩步骤:

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

代码如下:

/**
* 处理压缩包文件
*
* @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来进行保存,压缩包遍历中可以按照业务需求进行文件区分再进行其他操作。

这些年程序员生涯,发现网上一些解决方案很少有完整的,都是零零散散的,查起来特别费劲,所以自己写解决方案会尽量要求写完整,方便自己也方便别人。

文章目录
  1. 1. 前言
  2. 2. 一、压缩包上传
    1. 2.1. 1、接口实现
    2. 2.2. 2、获取压缩包的文件名和文件路径
  3. 3. 二、压缩包解压并保存
    1. 3.1. 1、处理压缩包文件方法
    2. 3.2. 2、接口中实现处理压缩包
  4. 4. 三、总结