调整 音频合成
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
package com.rj.controller;
|
||||
|
||||
import com.rj.service.IFaceDetectLogService;
|
||||
import com.rj.service.MinIOService;
|
||||
import com.rj.utils.MinIOUrlGenerator;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.Parameter;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@@ -8,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -24,6 +27,12 @@ public class FaceDetectController {
|
||||
@Autowired
|
||||
private IFaceDetectLogService faceDetectLogService;
|
||||
|
||||
@Autowired
|
||||
private MinIOService minioService;
|
||||
|
||||
@Autowired
|
||||
private MinIOUrlGenerator urlGenerator;
|
||||
|
||||
/**
|
||||
* 人脸检测接口
|
||||
*/
|
||||
@@ -31,7 +40,13 @@ public class FaceDetectController {
|
||||
@Operation(summary = "人脸检测", description = "检测图片中的人脸信息")
|
||||
public ResponseEntity<Map<String, Object>> detectFace(
|
||||
@Parameter(description = "图片URL", required = true)
|
||||
@RequestParam String imageUrl) {
|
||||
@RequestParam String imageUrl,
|
||||
@Parameter(description = "所属人姓名", required = false)
|
||||
@RequestParam(value = "ownerName", required = false) String ownerName,
|
||||
@Parameter(description = "所属人电话", required = false)
|
||||
@RequestParam(value = "ownerPhone", required = false) String ownerPhone,
|
||||
@Parameter(description = "头像名称", required = false)
|
||||
@RequestParam(value = "avatarName", required = false) String avatarName) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
@@ -39,7 +54,7 @@ public class FaceDetectController {
|
||||
log.info("开始人脸检测,图片URL: {}", imageUrl);
|
||||
|
||||
// 执行人脸检测
|
||||
com.rj.entity.FaceDetectLog detectLog = faceDetectLogService.detectFaceAndSave(imageUrl);
|
||||
com.rj.entity.FaceDetectLog detectLog = faceDetectLogService.detectFaceAndSave(imageUrl, ownerName, ownerPhone, avatarName);
|
||||
|
||||
result.put("success", detectLog.getSuccess());
|
||||
result.put("message", detectLog.getSuccess() ? "人脸检测成功" : "人脸检测失败");
|
||||
@@ -47,6 +62,9 @@ public class FaceDetectController {
|
||||
result.put("requestId", detectLog.getRequestId());
|
||||
result.put("faceCount", detectLog.getFaceCount());
|
||||
result.put("processingTimeMs", detectLog.getProcessingTimeMs());
|
||||
result.put("ownerName", detectLog.getOwnerName());
|
||||
result.put("ownerPhone", detectLog.getOwnerPhone());
|
||||
result.put("avatarName", detectLog.getAvatarName());
|
||||
|
||||
if (!detectLog.getSuccess()) {
|
||||
result.put("errorMessage", detectLog.getErrorMessage());
|
||||
@@ -63,6 +81,135 @@ public class FaceDetectController {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 头衔上传接口
|
||||
* 实现:文件上传 -> 生成短链接 -> 人脸检测
|
||||
*/
|
||||
@PostMapping("/avatar/upload")
|
||||
@Operation(summary = "头衔上传", description = "上传头像文件,生成短链接并进行人脸检测")
|
||||
public ResponseEntity<Map<String, Object>> uploadAvatar(
|
||||
@Parameter(description = "头像文件", required = true)
|
||||
@RequestParam("file") MultipartFile file,
|
||||
@Parameter(description = "用户ID", required = false)
|
||||
@RequestParam(value = "userId", required = false) String userId,
|
||||
@Parameter(description = "所属人姓名", required = false)
|
||||
@RequestParam(value = "ownerName", required = false) String ownerName,
|
||||
@Parameter(description = "所属人电话", required = false)
|
||||
@RequestParam(value = "ownerPhone", required = false) String ownerPhone,
|
||||
@Parameter(description = "头像名称", required = false)
|
||||
@RequestParam(value = "avatarName", required = false) String avatarName,
|
||||
@Parameter(description = "短链接有效期(秒),默认1小时", required = false)
|
||||
@RequestParam(value = "expiresInSeconds", defaultValue = "3600") int expiresInSeconds) {
|
||||
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
|
||||
try {
|
||||
log.info("开始处理头衔上传,文件名: {}, 大小: {} bytes, 用户ID: {}",
|
||||
file.getOriginalFilename(), file.getSize(), userId);
|
||||
expiresInSeconds = 30*24*3600; // 默认30天
|
||||
// 1. 验证文件
|
||||
if (file.isEmpty()) {
|
||||
result.put("success", false);
|
||||
result.put("message", "文件不能为空");
|
||||
return ResponseEntity.badRequest().body(result);
|
||||
}
|
||||
|
||||
// 验证文件类型
|
||||
String contentType = file.getContentType();
|
||||
if (contentType == null || (!contentType.startsWith("image/"))) {
|
||||
result.put("success", false);
|
||||
result.put("message", "只支持图片文件格式");
|
||||
return ResponseEntity.badRequest().body(result);
|
||||
}
|
||||
|
||||
// 验证文件大小(限制为10MB,与Spring配置保持一致)
|
||||
if (file.getSize() > 10 * 1024 * 1024) {
|
||||
result.put("success", false);
|
||||
result.put("message", "文件大小不能超过10MB");
|
||||
return ResponseEntity.badRequest().body(result);
|
||||
}
|
||||
|
||||
// 2. 上传文件到MinIO
|
||||
log.info("开始上传文件到MinIO...");
|
||||
String fileUrl = minioService.uploadFile(file);
|
||||
log.info("文件上传成功,URL: {}", fileUrl);
|
||||
|
||||
// 3. 生成短链接(临时访问URL)
|
||||
log.info("开始生成短链接,有效期: {}秒", expiresInSeconds);
|
||||
String fileName = extractFileNameFromUrl(fileUrl);
|
||||
MinIOUrlGenerator.UrlInfo urlInfo = urlGenerator.generateTempUrl(fileName, expiresInSeconds);
|
||||
|
||||
if (!urlInfo.isSuccess()) {
|
||||
result.put("success", false);
|
||||
result.put("message", "生成短链接失败: " + urlInfo.getErrorMessage());
|
||||
return ResponseEntity.internalServerError().body(result);
|
||||
}
|
||||
|
||||
String shortUrl = urlInfo.getUrl();
|
||||
log.info("短链接生成成功: {}", shortUrl);
|
||||
|
||||
// 4. 进行人脸检测
|
||||
log.info("开始进行人脸检测...");
|
||||
com.rj.entity.FaceDetectLog detectLog = faceDetectLogService.detectFaceAndSave(shortUrl, ownerName, ownerPhone, avatarName);
|
||||
|
||||
// 5. 构建响应结果
|
||||
result.put("success", true);
|
||||
result.put("message", "头衔上传处理完成");
|
||||
result.put("originalFileName", file.getOriginalFilename());
|
||||
result.put("fileSize", file.getSize());
|
||||
result.put("fileUrl", fileUrl);
|
||||
result.put("shortUrl", shortUrl);
|
||||
result.put("shortUrlExpiresAt", urlInfo.getFormattedExpiresAt());
|
||||
result.put("shortUrlExpiresInSeconds", expiresInSeconds);
|
||||
result.put("userId", userId);
|
||||
result.put("ownerName", ownerName);
|
||||
result.put("ownerPhone", ownerPhone);
|
||||
result.put("avatarName", avatarName);
|
||||
|
||||
// 人脸检测结果
|
||||
result.put("faceDetection", Map.of(
|
||||
"success", detectLog.getSuccess(),
|
||||
"faceCount", detectLog.getFaceCount(),
|
||||
"processingTimeMs", detectLog.getProcessingTimeMs(),
|
||||
"requestId", detectLog.getRequestId()
|
||||
));
|
||||
|
||||
if (!detectLog.getSuccess()) {
|
||||
result.put("faceDetectionError", detectLog.getErrorMessage());
|
||||
log.warn("人脸检测失败: {}", detectLog.getErrorMessage());
|
||||
} else {
|
||||
log.info("人脸检测成功,检测到 {} 张人脸", detectLog.getFaceCount());
|
||||
}
|
||||
|
||||
log.info("头衔上传处理完成,文件URL: {}, 短链接: {}", fileUrl, shortUrl);
|
||||
return ResponseEntity.ok(result);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("头衔上传处理失败: {}", e.getMessage(), e);
|
||||
result.put("success", false);
|
||||
result.put("message", "头衔上传处理失败: " + e.getMessage());
|
||||
return ResponseEntity.internalServerError().body(result);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 从URL中提取文件名
|
||||
*/
|
||||
private String extractFileNameFromUrl(String fileUrl) {
|
||||
if (fileUrl == null || fileUrl.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// 从URL中提取文件名部分
|
||||
// 例如: http://101.35.52.237:19005/car/filename.jpg -> filename.jpg
|
||||
int lastSlashIndex = fileUrl.lastIndexOf('/');
|
||||
if (lastSlashIndex != -1 && lastSlashIndex < fileUrl.length() - 1) {
|
||||
return fileUrl.substring(lastSlashIndex + 1);
|
||||
}
|
||||
|
||||
return fileUrl;
|
||||
}
|
||||
|
||||
/**
|
||||
* 分页查询人脸检测日志
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user