图片上传

This commit is contained in:
方亮 2025-09-26 14:43:13 +08:00
parent b000f4a841
commit fb37f83e5b
4 changed files with 146 additions and 54 deletions

View File

@ -65,19 +65,21 @@ public class PmWorkerController extends BaseController {
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth, requiresPermissions = @RequiresPermissions("worker:ein:insert")) @RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth, requiresPermissions = @RequiresPermissions("worker:ein:insert"))
@PostMapping("/insert") @PostMapping("/insert")
@SysLog(title = "新增人员入场", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->出入场管理->人员入场管理", details = "新增人员入场") @SysLog(title = "新增人员入场", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->出入场管理->人员入场管理", details = "新增人员入场")
public AjaxResult insert(@RequestParam(value = "files") MultipartFile[] files,@RequestParam(value = "fileMsg") String fileMsg, @RequestParam(value = "params")String params) { public AjaxResult insert(@RequestParam(value = "files",required = false) MultipartFile[] files,@RequestParam(value = "fileMsg",required = false) String fileMsg, @RequestParam(value = "params")String params) {
try { try {
params= Sm4Utils.decrypt(params); params= Sm4Utils.decrypt(params);
fileMsg= Sm4Utils.decrypt(fileMsg); fileMsg= Sm4Utils.decrypt(fileMsg);
List<WebFileDto> listFile = FastJsonHelper.jsonArrStrToBeanList(fileMsg, WebFileDto.class); List<WebFileDto> listFile = FastJsonHelper.jsonArrStrToBeanList(fileMsg, WebFileDto.class);
// 验证对应关系 if(files != null && files.length > 0){
if (listFile.size() != files.length) { // 验证对应关系
logger.error("文件信息:{}文件数量:{}", listFile.size(), files.length); if (listFile.size() != files.length) {
throw new IllegalArgumentException("文件信息与文件数量不匹配"); logger.error("文件信息:{}文件数量:{}", listFile.size(), files.length);
} throw new IllegalArgumentException("文件信息与文件数量不匹配");
//先将数据对应关系处理还 }
for (int i = 0; i < listFile.size(); i++) { //先将数据对应关系处理还
listFile.get(i).setFile(files[i]); for (int i = 0; i < listFile.size(); i++) {
listFile.get(i).setFile(files[i]);
}
} }
PmWorker o = FastJsonHelper.jsonStrToBean(params, PmWorker.class); PmWorker o = FastJsonHelper.jsonStrToBean(params, PmWorker.class);
return service.insert(o,listFile); return service.insert(o,listFile);
@ -210,6 +212,59 @@ public class PmWorkerController extends BaseController {
} }
} }
/**
* 人脸照片合格检测
* @param base64file
* @return
*/
@RequiresPermissionsOrInnerAuth(innerAuth = @InnerAuth, requiresPermissions = @RequiresPermissions("worker:ein:face"))
@PostMapping("/faceDetectionBase64")
@SysLog(title = "人脸照片合格检测", businessType = OperaType.UPDATE, logType = 0, module = "施工人员->出入场管理->人员入场管理", details = "人脸照片合格检测")
public AjaxResult faceDetection(@RequestParam(value = "file") String base64file) {
if (base64file == null || base64file.isEmpty()) {
return AjaxResult.error("文件为空");
}
File tempFile = null;
try {
// 解码base64数据
String base64Data = base64file;
if (base64file.startsWith("data:image")) {
// 如果是data URL格式提取base64部分
base64Data = base64file.substring(base64file.indexOf(",") + 1);
}
// 确定文件扩展名简单处理可根据实际需求调整
String suffix = ".jpg"; // 默认jpg格式
if (base64file.contains("png")) {
suffix = ".png";
} else if (base64file.contains("jpeg")) {
suffix = ".jpeg";
}
// 创建临时文件
tempFile = Files.createTempFile("temp-image-", suffix).toFile();
tempFile.deleteOnExit(); // JVM退出时自动删除
// 将base64数据写入临时文件
byte[] imageBytes = java.util.Base64.getDecoder().decode(base64Data);
java.nio.file.Files.write(tempFile.toPath(), imageBytes);
ArcFaceHelper arcFaceHelper = new ArcFaceHelper();
// 调用原方法传入临时文件的路径
String faceFeatures = arcFaceHelper.getIsFaceImage(tempFile.getAbsolutePath());
String[] split = faceFeatures.split(",");
if ("200".equals(split[0])){
return AjaxResult.success(split[1]);
}else{
return AjaxResult.error(split[1]);
}
} catch (IOException e) {
// 处理异常如磁盘满权限不足等
e.printStackTrace();
return AjaxResult.error("人脸检测失败:"+e.getMessage());
} catch (Exception e) {
e.printStackTrace();
return AjaxResult.error("人脸检测失败:"+e.getMessage());
}
}
/** /**
* 人员信息导出 * 人员信息导出
*/ */

View File

@ -1,13 +1,13 @@
package com.bonus.bmw.domain.vo; package com.bonus.bmw.domain.vo;
import java.util.Date;
import java.util.List;
import com.bonus.common.core.annotation.Excel; import com.bonus.common.core.annotation.Excel;
import com.bonus.system.api.model.UploadFileVo; import com.bonus.system.api.model.UploadFileVo;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data; import lombok.Data;
import java.util.Date;
import java.util.List;
/** /**
* 人员基础信息表 * 人员基础信息表
*/ */
@ -196,4 +196,6 @@ public class PmWorker {
private String isShanghai; private String isShanghai;
private String facePhotoBase64;
} }

View File

@ -30,6 +30,7 @@ import javax.validation.Validator;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.Period; import java.time.Period;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -107,16 +108,28 @@ public class PmWorkerServiceImpl implements PmWorkerService{
record.setCreateUser(SecurityUtils.getLoginUser().getSysUser().getUserName()); record.setCreateUser(SecurityUtils.getLoginUser().getSysUser().getUserName());
int insert = mapper.insert(record); int insert = mapper.insert(record);
if(insert > 0){ if(insert > 0){
List<WebFileDto> collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList()); List<UploadFileVo> uploadFileVos = new ArrayList<>();
//组装数据 boolean isBase64 = false;
MultipartFile[] workerFiles = new MultipartFile[collect.size()]; MultipartFile facePhoto = null;
String[] type = new String[collect.size()]; //判断是否上传base64人脸优先base64
for (int i = 0; i < collect.size(); i++) { if(StringUtils.isNotEmpty(record.getFacePhotoBase64())){
workerFiles[i] = collect.get(i).getFile(); //人脸的数据添加
type[i] = collect.get(i).getType(); UploadFileVo uploadFileVo = fileUploadUtils.uploadBast64(record.getFacePhotoBase64(), Constants.FILE_UPLOAD_WORKER, record.getId().toString(), "人脸照片","", "");
uploadFileVos.add(uploadFileVo);
isBase64 = true;
}else{
List<WebFileDto> collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList());
//组装数据
MultipartFile[] workerFiles = new MultipartFile[collect.size()];
String[] type = new String[collect.size()];
for (int i = 0; i < collect.size(); i++) {
workerFiles[i] = collect.get(i).getFile();
type[i] = collect.get(i).getType();
}
//人脸的数据添加
uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", "");
facePhoto = collect.get(0).getFile();
} }
//人脸的数据添加
List<UploadFileVo> uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", "");
//入场相关数据添加 //入场相关数据添加
addWorkerEinData(record,fileMsg); addWorkerEinData(record,fileMsg);
//下发人脸到考勤机 //下发人脸到考勤机
@ -127,11 +140,15 @@ public class PmWorkerServiceImpl implements PmWorkerService{
sb.append("人员下发考勤机失败--"); sb.append("人员下发考勤机失败--");
} }
//下发人脸到人脸库 //下发人脸到人脸库
if(!collect.isEmpty()){ if(!uploadFileVos.isEmpty()){
FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean(); FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean();
faceRecognitionBean.setUniqueKey(record.getIdNumber()); faceRecognitionBean.setUniqueKey(record.getIdNumber());
faceRecognitionBean.setOptMode("add"); faceRecognitionBean.setOptMode("add");
sb.append(appRecognitionService.uploadFaceRecognition(collect.get(0).getFile(), faceRecognitionBean)); if(isBase64){
sb.append(appRecognitionService.uploadFaceRecognition(record.getFacePhotoBase64(), faceRecognitionBean));
}else{
sb.append(appRecognitionService.uploadFaceRecognition(facePhoto, faceRecognitionBean));
}
} }
} }
} }
@ -279,17 +296,28 @@ public class PmWorkerServiceImpl implements PmWorkerService{
int update = mapper.updateByPrimaryKey(record); int update = mapper.updateByPrimaryKey(record);
//人脸照片是否修改 //人脸照片是否修改
List<WebFileDto> collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList()); List<WebFileDto> collect = fileMsg.stream().filter(data -> "faceImg".equals(data.getName())).collect(Collectors.toList());
if(!collect.isEmpty()){ if(!collect.isEmpty() || record.getFacePhotoBase64() != null){
String s = fileUploadUtils.delFileListById("", record.getId().toString(), Constants.FILE_UPLOAD_WORKER, ""); String s = fileUploadUtils.delFileListById("", record.getId().toString(), Constants.FILE_UPLOAD_WORKER, "");
//组装数据 List<UploadFileVo> uploadFileVos = new ArrayList<>();
MultipartFile[] workerFiles = new MultipartFile[collect.size()]; boolean isBase64 = false;
String[] type = new String[collect.size()]; MultipartFile facePhoto = null;
for (int i = 0; i < collect.size(); i++) { if(record.getFacePhotoBase64() != null){
workerFiles[i] = collect.get(i).getFile(); //判断是否上传base64人脸优先base64
type[i] = collect.get(i).getType(); UploadFileVo uploadFileVo = fileUploadUtils.uploadBast64(record.getFacePhotoBase64(), Constants.FILE_UPLOAD_WORKER, record.getId().toString(), "人脸照片","", "");
uploadFileVos.add(uploadFileVo);
isBase64 = true;
}else{
//组装数据
MultipartFile[] workerFiles = new MultipartFile[collect.size()];
String[] type = new String[collect.size()];
for (int i = 0; i < collect.size(); i++) {
workerFiles[i] = collect.get(i).getFile();
type[i] = collect.get(i).getType();
}
//人脸的数据添加
uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", "");
facePhoto = collect.get(0).getFile();
} }
//人脸的数据添加
List<UploadFileVo> uploadFileVos = fileUploadUtils.uploadFile(workerFiles, Constants.FILE_UPLOAD_WORKER, record.getId().toString(), type,"", "");
//下发人脸到考勤机 //下发人脸到考勤机
try { try {
if(record.getEinStatus() == 1){ if(record.getEinStatus() == 1){
@ -304,10 +332,16 @@ public class PmWorkerServiceImpl implements PmWorkerService{
sb.append("人员下发考勤机失败--"); sb.append("人员下发考勤机失败--");
} }
//下发人脸到人脸库 //下发人脸到人脸库
FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean(); if(!uploadFileVos.isEmpty()){
faceRecognitionBean.setUniqueKey(record.getIdNumber()); FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean();
faceRecognitionBean.setOptMode("add"); faceRecognitionBean.setUniqueKey(record.getIdNumber());
sb.append(appRecognitionService.uploadFaceRecognition(collect.get(0).getFile(), faceRecognitionBean)); faceRecognitionBean.setOptMode("add");
if(isBase64){
sb.append(appRecognitionService.uploadFaceRecognition(record.getFacePhotoBase64(), faceRecognitionBean));
}else{
sb.append(appRecognitionService.uploadFaceRecognition(facePhoto, faceRecognitionBean));
}
}
} }
if(record.getEinStatus() == 1){ if(record.getEinStatus() == 1){
//已经入过场了 //已经入过场了

View File

@ -11,7 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
@ -35,10 +34,17 @@ public class FileUtilsServiceImpl {
private FileUtilMapper mapper; private FileUtilMapper mapper;
public UploadFileVo upload(String sourceTable, String sourceId, String sourceType,String prefix,String bast64,String bucketName) { public UploadFileVo upload(String sourceTable, String sourceId, String sourceType,String prefix,String bast64,String bucketName) {
if(bast64.contains(",")){
bast64 = bast64.split(",")[1];
}
UploadFileVo vo=new UploadFileVo(); UploadFileVo vo=new UploadFileVo();
String suffix;
if(bast64.contains(",")){
String de = bast64.split(",")[1];
byte[] decodedBytes = Base64.getDecoder().decode(de);
// 计算文件大小
int fileSizeInBytes = decodedBytes.length;
long size = (long) Math.ceil(fileSizeInBytes / 1024.0); // 向上取整并保持long类型
vo.setFileSize(size);
}
vo.setSourceId(sourceId); vo.setSourceId(sourceId);
vo.setSourceTable(sourceTable); vo.setSourceTable(sourceTable);
vo.setSourceType(sourceType); vo.setSourceType(sourceType);
@ -46,24 +52,19 @@ public class FileUtilsServiceImpl {
prefix=floor; prefix=floor;
} }
String originFileName = "bast64"; String originFileName = "bast64";
String day= DateUtils.getCurrentYear(); String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth(); String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear(); String year=DateUtils.getCurrentYear();
String uuid = StringUtils.randomUUID(); String uuid = StringUtils.randomUUID();
String suffix=getBase64Type(bast64); suffix=getBase64Type(bast64);
// String suffix=StringUtils.substringAfterLast(originFileName, ".");
// 解码Base64字符串
byte[] decodedBytes = Base64.getDecoder().decode(bast64); String fileName=uuid+".jpeg";
// 计算文件大小
int fileSizeInBytes = decodedBytes.length;
double kilobytes = fileSizeInBytes / 1024.0;
long size=Long.parseLong(String.valueOf(kilobytes));
String fileName=uuid+"."+suffix;
String filePath=prefix+"/"+year+"/"+month+"/"+day+"/"+fileName; String filePath=prefix+"/"+year+"/"+month+"/"+day+"/"+fileName;
vo.setFilePath(filePath); vo.setFilePath(filePath);
vo.setOriginFileName(fileName); vo.setOriginFileName(fileName);
vo.setFileName(fileName); vo.setFileName(fileName);
vo.setFileSize(size);
vo.setOriginFileName(originFileName); vo.setOriginFileName(originFileName);
if(StringHelper.isNullOrEmptyString(bucketName)){ if(StringHelper.isNullOrEmptyString(bucketName)){
bucketName=minioConfig.getBucketName(); bucketName=minioConfig.getBucketName();
@ -104,7 +105,7 @@ public class FileUtilsServiceImpl {
prefix=floor; prefix=floor;
} }
String originFileName = file.getOriginalFilename(); String originFileName = file.getOriginalFilename();
String day= DateUtils.getCurrentYear(); String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth(); String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear(); String year=DateUtils.getCurrentYear();
String uuid = StringUtils.randomUUID(); String uuid = StringUtils.randomUUID();
@ -148,7 +149,7 @@ public class FileUtilsServiceImpl {
if(StringHelper.isNullOrEmptyString(prefix)){ if(StringHelper.isNullOrEmptyString(prefix)){
prefix=floor; prefix=floor;
} }
String day= DateUtils.getCurrentYear(); String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth(); String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear(); String year=DateUtils.getCurrentYear();
if(StringHelper.isNullOrEmptyString(bucketName)){ if(StringHelper.isNullOrEmptyString(bucketName)){
@ -194,7 +195,7 @@ public class FileUtilsServiceImpl {
if(StringHelper.isNullOrEmptyString(prefix)){ if(StringHelper.isNullOrEmptyString(prefix)){
prefix=floor; prefix=floor;
} }
String day= DateUtils.getCurrentYear(); String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth(); String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear(); String year=DateUtils.getCurrentYear();
if(StringHelper.isNullOrEmptyString(bucketName)){ if(StringHelper.isNullOrEmptyString(bucketName)){