前言

当前项目有这样一个需求,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);
        }
    }
}

实现效果

image-20240407171414426

image-20240407171439848