获取文件服务的文件并打包压缩至本地
前言
当前项目有这样一个需求,mysql数据库中一张人员表存放了人员的照片路径,照片是集中存放在文件服务器上,当前项目文件服务器使用的是minio
表结构(供参考,只为了取值)
DROP TABLE IF EXISTS `cm_person`;
CREATE TABLE `cm_person` (
`person_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '人员ID',
`unit_id` bigint(20) NOT NULL COMMENT '单位id',
`depart_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID',
`name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '姓名',
`person_group` tinyint(2) NULL DEFAULT NULL COMMENT '组别',
`code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '人员编号',
`tel` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '电话',
`mobile` varchar(15) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '手机号',
`sex` tinyint(1) NOT NULL COMMENT '性别',
`birth_date` date NULL DEFAULT NULL COMMENT '出生日期',
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
`id_card` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '身份证号',
`photo_url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '照片路径',
`remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '备注',
`nation` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '民族',
`native_place` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '籍贯',
`school` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最后毕业的学校',
`major` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '专业',
`qualifications` tinyint(2) NULL DEFAULT NULL COMMENT '1:大专及以下 2:本科 3:硕士 4:博士',
`degree` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '最高学位',
`political_belief` tinyint(2) NULL DEFAULT NULL COMMENT '政治面貌(\'1:中共党员 2:中共预备党员 3:共青团员 4:民革党员 5:民盟盟员 6:民建会员 7:民进会员 8:农工党党员 9:致公党党员 10:九三学社社员 11:台盟盟员 12:无党派人士 13:群众)',
`post_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '职务',
`safe_role` tinyint(255) NOT NULL DEFAULT 0 COMMENT '人员在企业中的安全角色 1:分管领导、3:安全总监、4:安全管理部门负责人、5:车间主任、6:安全管理人员、7:特种作业人员、9. 主要负责人',
`hiredate` date NULL DEFAULT NULL COMMENT '入职时间',
`work_experience` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '工作经历',
`person_type` tinyint(2) NULL DEFAULT NULL COMMENT '1;外协员工\r\n2:临时人员\r\n3:员工',
`del_flg` tinyint(2) NOT NULL COMMENT '0:正常 1逻辑删除',
`create_id` bigint(20) NOT NULL COMMENT '创建人id',
`create_time` datetime(0) NOT NULL COMMENT '创建时间',
`update_id` bigint(20) NOT NULL COMMENT '更新人id',
`update_time` datetime(0) NOT NULL COMMENT '更新时间',
`hk_person_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '海康平台人员id',
`hk_person_code` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '海康平台卡号',
`is_apply` tinyint(1) NULL DEFAULT 0 COMMENT '是否为申请人1:是 0:否',
`synchronization_status` tinyint(2) NULL DEFAULT NULL COMMENT '同步状态 0:否 1:是',
`flag` tinyint(1) NULL DEFAULT NULL COMMENT '正常0 无照片1 未开卡2 ',
`hk_face_id` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '海康平台人脸ID',
`hk_handle_status` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '0:无人脸数据 1:增加人脸 2:修改人脸',
PRIMARY KEY (`person_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5581 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '公共-企业人员信息' ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
工具说明
代码中主要使用了如下工具
HikariCP
数据库连接池mybatis plus
持久层框架minio
文件服务器,使用了allbs-oss
自开发的支持S3协议的操作工具
源码地址
https://github.com/chenqi92/photo-tool.git
源码说明
使用allbs-oss
文件操作工具连接minio文件服务器
oss:
# 连接地址,因为我在host中配置了pc-server的ip所以这边直接用字符串即可
endpoint: http://pc-server:9000
# 地区
region: us-west-rack-2
# minio账号
access-key: minio
# minio密码
secret-key: 123456
# 文件服务器上默认的储存桶,用于区分项目时使用,可为空
bucket-name:
application添加注解@EnableAllbsOss
启用该工具
创建一个项目启动即可执行的类
实现CommandLineRunner
即可
@Slf4j
@Component
public class DownAllPhoto implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
}
}
查询数据库中想要的人员数据,并转为以姓名_身份证号的形式下载后打包至D盘中
package cn.allbs.phototool.task;
import cn.allbs.oss.service.OssTemplate;
import cn.allbs.phototool.entity.cm.CmPersonEntity;
import cn.allbs.phototool.service.cm.CmPersonService;
import com.amazonaws.services.s3.model.S3Object;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
/**
* 类 DownAllPhoto
*
* @author ChenQi
* @date 2024/4/7
*/
@Slf4j
@Component
public class DownAllPhoto implements CommandLineRunner {
@Resource
private CmPersonService cmPersonService;
@Resource
private OssTemplate ossTemplate;
@Override
public void run(String... args) throws Exception {
// 查询人员相关信息
List<CmPersonEntity> persons = cmPersonService.list(Wrappers.<CmPersonEntity>query().lambda().isNull(CmPersonEntity::getHkPersonId).and(i -> i.isNotNull(CmPersonEntity::getPhotoUrl).or().isNotNull(CmPersonEntity::getPhotoUrl)));
log.info("当前查询到人员总数:{}", persons.size());
// 创建一个文件夹来保存图片
Path dirPath = Paths.get("tempImages");
if (!Files.exists(dirPath)) {
try {
Files.createDirectory(dirPath);
} catch (IOException e) {
log.error("创建文件夹失败", e);
return;
}
}
// 获取文件服务器中的文件
persons.forEach(person -> {
try (S3Object s3Object = ossTemplate.getObject("pcfiles", person.getPhotoUrl())) {
InputStream inputStream = s3Object.getObjectContent();
String fileName = person.getName() + "_" + person.getIdCard() + ".jpg";
log.info("下载文件:{}", fileName);
Path outputPath = dirPath.resolve(fileName);
Files.copy(inputStream, outputPath, StandardCopyOption.REPLACE_EXISTING);
} catch (Exception e) {
log.error("文件下载失败", e);
}
});
// 创建一个ZIP文件
Path zipPath = Paths.get("D:\\images.zip");
try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipPath.toFile()))) {
Files.walk(dirPath).filter(path -> !Files.isDirectory(path)).forEach(path -> {
ZipEntry zipEntry = new ZipEntry(dirPath.relativize(path).toString());
try {
zos.putNextEntry(zipEntry);
Files.copy(path, zos);
zos.closeEntry();
} catch (IOException e) {
log.error("添加文件到ZIP失败", e);
}
});
} catch (IOException e) {
log.error("创建ZIP文件失败", e);
}
}
}
实现效果
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ALLBS!
评论