图片上传

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"))
@PostMapping("/insert")
@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 {
params= Sm4Utils.decrypt(params);
fileMsg= Sm4Utils.decrypt(fileMsg);
List<WebFileDto> listFile = FastJsonHelper.jsonArrStrToBeanList(fileMsg, WebFileDto.class);
// 验证对应关系
if (listFile.size() != files.length) {
logger.error("文件信息:{}文件数量:{}", listFile.size(), files.length);
throw new IllegalArgumentException("文件信息与文件数量不匹配");
}
//先将数据对应关系处理还
for (int i = 0; i < listFile.size(); i++) {
listFile.get(i).setFile(files[i]);
if(files != null && files.length > 0){
// 验证对应关系
if (listFile.size() != files.length) {
logger.error("文件信息:{}文件数量:{}", listFile.size(), files.length);
throw new IllegalArgumentException("文件信息与文件数量不匹配");
}
//先将数据对应关系处理还
for (int i = 0; i < listFile.size(); i++) {
listFile.get(i).setFile(files[i]);
}
}
PmWorker o = FastJsonHelper.jsonStrToBean(params, PmWorker.class);
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;
import java.util.Date;
import java.util.List;
import com.bonus.common.core.annotation.Excel;
import com.bonus.system.api.model.UploadFileVo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 人员基础信息表
*/
@ -196,4 +196,6 @@ public class PmWorker {
private String isShanghai;
private String facePhotoBase64;
}

View File

@ -30,6 +30,7 @@ import javax.validation.Validator;
import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -107,16 +108,28 @@ public class PmWorkerServiceImpl implements PmWorkerService{
record.setCreateUser(SecurityUtils.getLoginUser().getSysUser().getUserName());
int insert = mapper.insert(record);
if(insert > 0){
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();
List<UploadFileVo> uploadFileVos = new ArrayList<>();
boolean isBase64 = false;
MultipartFile facePhoto = null;
//判断是否上传base64人脸优先base64
if(StringUtils.isNotEmpty(record.getFacePhotoBase64())){
//人脸的数据添加
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);
//下发人脸到考勤机
@ -127,11 +140,15 @@ public class PmWorkerServiceImpl implements PmWorkerService{
sb.append("人员下发考勤机失败--");
}
//下发人脸到人脸库
if(!collect.isEmpty()){
if(!uploadFileVos.isEmpty()){
FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean();
faceRecognitionBean.setUniqueKey(record.getIdNumber());
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);
//人脸照片是否修改
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, "");
//组装数据
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();
List<UploadFileVo> uploadFileVos = new ArrayList<>();
boolean isBase64 = false;
MultipartFile facePhoto = null;
if(record.getFacePhotoBase64() != null){
//判断是否上传base64人脸优先base64
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 {
if(record.getEinStatus() == 1){
@ -304,10 +332,16 @@ public class PmWorkerServiceImpl implements PmWorkerService{
sb.append("人员下发考勤机失败--");
}
//下发人脸到人脸库
FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean();
faceRecognitionBean.setUniqueKey(record.getIdNumber());
faceRecognitionBean.setOptMode("add");
sb.append(appRecognitionService.uploadFaceRecognition(collect.get(0).getFile(), faceRecognitionBean));
if(!uploadFileVos.isEmpty()){
FaceRecognitionBean faceRecognitionBean = new FaceRecognitionBean();
faceRecognitionBean.setUniqueKey(record.getIdNumber());
faceRecognitionBean.setOptMode("add");
if(isBase64){
sb.append(appRecognitionService.uploadFaceRecognition(record.getFacePhotoBase64(), faceRecognitionBean));
}else{
sb.append(appRecognitionService.uploadFaceRecognition(facePhoto, faceRecognitionBean));
}
}
}
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.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
@ -35,10 +34,17 @@ public class FileUtilsServiceImpl {
private FileUtilMapper mapper;
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();
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.setSourceTable(sourceTable);
vo.setSourceType(sourceType);
@ -46,24 +52,19 @@ public class FileUtilsServiceImpl {
prefix=floor;
}
String originFileName = "bast64";
String day= DateUtils.getCurrentYear();
String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear();
String uuid = StringUtils.randomUUID();
String suffix=getBase64Type(bast64);
// String suffix=StringUtils.substringAfterLast(originFileName, ".");
// 解码Base64字符串
byte[] decodedBytes = Base64.getDecoder().decode(bast64);
// 计算文件大小
int fileSizeInBytes = decodedBytes.length;
double kilobytes = fileSizeInBytes / 1024.0;
long size=Long.parseLong(String.valueOf(kilobytes));
String fileName=uuid+"."+suffix;
suffix=getBase64Type(bast64);
String fileName=uuid+".jpeg";
String filePath=prefix+"/"+year+"/"+month+"/"+day+"/"+fileName;
vo.setFilePath(filePath);
vo.setOriginFileName(fileName);
vo.setFileName(fileName);
vo.setFileSize(size);
vo.setOriginFileName(originFileName);
if(StringHelper.isNullOrEmptyString(bucketName)){
bucketName=minioConfig.getBucketName();
@ -104,7 +105,7 @@ public class FileUtilsServiceImpl {
prefix=floor;
}
String originFileName = file.getOriginalFilename();
String day= DateUtils.getCurrentYear();
String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear();
String uuid = StringUtils.randomUUID();
@ -148,7 +149,7 @@ public class FileUtilsServiceImpl {
if(StringHelper.isNullOrEmptyString(prefix)){
prefix=floor;
}
String day= DateUtils.getCurrentYear();
String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear();
if(StringHelper.isNullOrEmptyString(bucketName)){
@ -194,7 +195,7 @@ public class FileUtilsServiceImpl {
if(StringHelper.isNullOrEmptyString(prefix)){
prefix=floor;
}
String day= DateUtils.getCurrentYear();
String day= DateUtils.getCurrentDay();
String month=DateUtils.getCurrentMonth();
String year=DateUtils.getCurrentYear();
if(StringHelper.isNullOrEmptyString(bucketName)){