【SpringBoot项目实战】图片压缩包上传、解压、存储等等一套流程教学
- 前言
- 一、压缩包上传
- 1、接口实现
- 2、获取压缩包的文件名和文件路径
- 二、压缩包解压并保存
- 1、处理压缩包文件方法
- 解压缩步骤:
- 2、接口中实现处理压缩包
- 三、总结
前言
之前一直用的zip4j来对压缩包进行操作,但后来发现Hutool里面也有ZipUtil,ZipUtil是对 java.util.zip 做工具化封装
操作起来大同小异,改成了Hutool的ZipUtil,这样就少引用了一个依赖。
相关工具:Hutool 压缩工具-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来进行保存
压缩包遍历中可以按照业务需求进行文件区分再进行其他操作
这些年程序员生涯,发现网上一些解决方案很少有完整的
都是零零散散的,查起来特别费劲,所以自己写解决方案会尽量要求写完整
方便自己也方便别人
感谢您能看完本篇内容