materialFace/src/main/java/com/face/attachment/controller/FaceInfoManagerController.java

238 lines
11 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.face.attachment.controller;
import com.face.attachment.FileUploadProperties;
import com.face.attachment.FileUploadUtil;
import com.face.attachment.entity.FaceInfo;
import com.face.attachment.service.IFaceInfoService;
import com.face.attachment.service.vo.AttachmentVO;
import com.face.attachment.vo.*;
import com.face.global.controller.ManageBaseController;
import com.face.global.vo.ApiResult;
import com.face.global.vo.PageResponseVO;
import com.face.util.ApiResultBuilder;
import com.face.util.SystemExceptionUtils;
import com.tencentcloudapi.common.AbstractModel;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.facefusion.v20220927.FacefusionClient;
import com.tencentcloudapi.facefusion.v20220927.models.FuseFaceRequest;
import com.tencentcloudapi.facefusion.v20220927.models.FuseFaceResponse;
import com.tencentcloudapi.facefusion.v20220927.models.MergeInfo;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import java.io.File;
import java.io.IOException;
import java.math.BigInteger;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Base64;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Semaphore;
@RestController
@RequestMapping("/face/attachment")
@Slf4j
@Tag(name = "人脸融合基础管理")
public class FaceInfoManagerController extends ManageBaseController {
private static final String UPLOAD_DIR = "/uploads/";
@Autowired
private FileUploadProperties fileUploadProperties;
//定义信号资源包的总数 只有2个
Semaphore semaphore=new Semaphore(20);
@Autowired
private IFaceInfoService faceInfoService;
/* @Operation(summary = "修改人脸融合基础")
@PutMapping("/updateFaceInfo")
public ApiResult<Integer> updateFaceInfo(@Valid @RequestBody FaceInfoModRequestVO modRequestVO) throws Exception {
FaceInfo faceInfo = faceInfoService.updateFaceInfo(modRequestVO);
return ApiResultBuilder.getCommonBuilder(Integer.class).success(faceInfo != null
? BigInteger.ONE.intValue() : BigInteger.ZERO.intValue()).build();
}*/
/* @Operation(summary = "修改人模版脸图片")
@PostMapping("/updateImgFaceInfo")
public ApiResult<Integer> updateImgFaceInfo(@RequestParam("file") MultipartFile file,
@RequestParam(required = true, value = "faceId") String faceId) throws Exception {
FaceInfo faceInfo = faceInfoService.updateImgFaceInfo(file,faceId);
return ApiResultBuilder.getCommonBuilder(Integer.class).success(faceInfo != null
? BigInteger.ONE.intValue() : BigInteger.ZERO.intValue()).build();
}*/
/* @Operation(summary = "获取人脸融合基础详情")
@GetMapping("/getFaceInfo")
public ApiResult<FaceInfoDetailResponseVO> getFaceInfo(@RequestParam(value = "id") String id) throws Exception {
FaceInfoDetailResponseVO responseVO = faceInfoService.getFaceInfo(id);
return ApiResultBuilder.getCommonBuilder(FaceInfoDetailResponseVO.class).success(responseVO).build();
}*/
/* @Operation(summary = "分页查询人脸融合基础,包含总数")
@PostMapping("/pageAllFaceInfo")
public ApiResult<PageResponseVO<FaceInfoPageResponseVO>> pageAll(@Valid @RequestBody FaceInfoPageRequestVO pageRequestVO) throws Exception {
PageResponseVO<FaceInfoPageResponseVO> pageResponseVO = this.faceInfoService.pageAll(pageRequestVO);
return ApiResultBuilder.getPageCommonBuilder(FaceInfoPageResponseVO.class).success(pageResponseVO).build();
}*/
/* @Operation(summary = "根据腾讯活动ID和名称获取数据存入数据库")
@PostMapping("/addAllFaceInfoByTx")
public ApiResult<List<FaceInfo>> addAllFaceInfoByTx(@Valid @RequestBody FaceInfoTxRequestVO requestVO) throws Exception {
return ApiResultBuilder.getListBuilder(FaceInfo.class).success(faceInfoService.addAllFaceInfoByTx(requestVO)).build();
}*/
@Operation(summary = "获取所有活动")
@GetMapping("/queryAllActivity")
public ApiResult<List<FaceInfoTxRequestVO>> queryAllActivity() throws Exception {
return ApiResultBuilder.getListBuilder(FaceInfoTxRequestVO.class).success(faceInfoService.queryAllActivity()).build();
}
@Operation(summary = "获取所有人脸模版")
@PostMapping("/queryAllFaceInfo")
public ApiResult<List<FaceInfoDetailResponseVO>> queryAllFaceInfo(@Valid @RequestBody FaceInfoTxRequestVO requestVO) throws Exception {
return ApiResultBuilder.getListBuilder(FaceInfoDetailResponseVO.class).success(faceInfoService.queryAllFaceInfo(requestVO)).build();
}
@Operation(summary = "上传单个文件")
@PostMapping("/uploadSingleFile")
public ApiResult<FuseFaceResponse> uploadSingleFile(
@RequestParam("file") MultipartFile file,
@RequestParam(required = true, value = "activityId") String activityId,
@RequestParam(required = true, value = "materialId") String materialId,
@RequestParam(required = true, value = "faceId") String faceId
) throws Exception {
if(null!=file && file.getSize()> 3566353L){
throw SystemExceptionUtils.buildBusinessException("上传图片请不要超过3.3MB!");
}
String imgUrl="";
FuseFaceResponse resp=null;
//设置这个接口可用的资源数
int availablePermits=semaphore.availablePermits();
if(availablePermits<=0){
throw SystemExceptionUtils.buildBusinessException("当前请求已经过载,请稍后再尝试!");
}
try{
// 实例化一个认证对象,入参需要传入腾讯云账户 SecretId 和 SecretKey此处还需注意密钥对的保密
// 代码泄露可能会导致 SecretId 和 SecretKey 泄露并威胁账号下所有资源的安全性。以下代码示例仅供参考建议采用更安全的方式来使用密钥请参见https://cloud.tencent.com/document/product/1278/85305
// 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取
Credential cred = new Credential("AKIDdGj28B1jKl03tY2YxEJH6jGe8VgvzpbA", "PaXHn6B50pgWEoPr7EXxCIDvTr6AGFA4");
// 实例化一个http选项可选的没有特殊需求可以跳过
HttpProfile httpProfile = new HttpProfile();
httpProfile.setEndpoint("facefusion.tencentcloudapi.com");
// 实例化一个client选项可选的没有特殊需求可以跳过
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 实例化要请求产品的client对象,clientProfile是可选的
FacefusionClient client = new FacefusionClient(cred, "ap-chengdu", clientProfile);
// 实例化一个请求对象,每个接口都会对应一个request对象
FuseFaceRequest req = new FuseFaceRequest();
//活动ID
req.setProjectId(activityId);
// Path imageFile = Paths.get("F:\\体验腾讯人脸融合-素材\\222.jpg");
byte[] imageBytes = file.getBytes();
/*
// long timeStamp1 = System.currentTimeMillis();
Path uploadPath = Paths.get(fileUploadProperties.getUploadDir()).toAbsolutePath().normalize();
String originalFilename = file.getOriginalFilename();
String extendsName = originalFilename.substring(originalFilename.lastIndexOf("."));
// 2.文件重命名
String uuid = UUID.randomUUID().toString();
String newFileName = uuid.concat(extendsName);
Path filePath = uploadPath.resolve(newFileName);
//将文件存储在服务器的磁盘目录
file.transferTo(new File(filePath.toString()));
*/
String imgBase = Base64.getEncoder().encodeToString(imageBytes);
//{"MaterialInfos":[{"MaterialId":"mt_1895077021871144960","MaterialStatus":21,"CreateTime":"2025-02-27 19:42:25","UpdateTime":"2025-02-27 19:42:25","MaterialFaceList":[{"FaceId":"mt_1895077021871144960_1","FaceInfo":{"X":159,"Y":360,"Width":49,"Height":64}}],"MaterialName":"微信图片_20250227194033.png","AuditResult":""},{"MaterialId":"mt_1895077032491122688","MaterialStatus":21,"CreateTime":"2025-02-27 19:42:28","UpdateTime":"2025-02-27 19:42:28","MaterialFaceList":[{"FaceId":"mt_1895077032491122688_1","FaceInfo":{"X":373,"Y":362,"Width":49,"Height":69}}],"MaterialName":"微信图片_20250227194036.png","AuditResult":""},{"MaterialId":"mt_1895077041827643392","MaterialStatus":21,"CreateTime":"2025-02-27 19:42:30","UpdateTime":"2025-02-27 19:42:30","MaterialFaceList":[{"FaceId":"mt_1895077041827643392_1","FaceInfo":{"X":242,"Y":401,"Width":57,"Height":70}}],"MaterialName":"微信图片_20250227194038.png","AuditResult":""}],"Count":3,"RequestId":"3585e437-6a27-4dc9-b59b-11f66ca4382f"}
/* Activity_Id 活动ID
Material_Id 素材ID
Face_Id 人脸模版*/
//活动里面的素材ID
req.setModelId(materialId);
//图片返回方式 base64 url
req.setRspImgType("url");
MergeInfo mergeInfo=new MergeInfo();
mergeInfo.setImage(imgBase);
//mergeInfo.setUrl("http://www.gydzps.com/pic/add285fe-c034-47f4-a0ff-2568b1e082c1.jpg");
//素材人脸和对应FaceID
mergeInfo.setTemplateFaceID(faceId);
MergeInfo [] mergeInfos =new MergeInfo[1];
mergeInfos[0]=mergeInfo;
req.setMergeInfos(mergeInfos);
req.setLogoAdd(0L);
//请求占用一个资源
semaphore.acquire(1);
// 返回的resp是一个FuseFaceResponse的实例与请求对象对应
resp = client.FuseFace(req);
// 输出json格式的字符串回包
System.out.println(AbstractModel.toJsonString(resp));
} catch (TencentCloudSDKException e) {
log.error("TencentCloudSDKException", e);
} catch (IOException e) {
log.error("IOException", e);
} catch (Exception e) {
log.error("Exception", e);
}finally {
semaphore.release(1);//释放一个资源
}
return ApiResultBuilder.getCommonBuilder(FuseFaceResponse.class).success(resp).build();
}
}