238 lines
11 KiB
Java
238 lines
11 KiB
Java
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();
|
||
}
|
||
}
|