系统集成

This commit is contained in:
cwchen 2025-10-17 16:47:38 +08:00
parent a4aab7d02e
commit f929928a18
10 changed files with 297 additions and 41 deletions

View File

@ -0,0 +1,41 @@
package com.bonus.web.controller.common;
import com.bonus.common.core.domain.AjaxResult;
import com.bonus.web.service.common.CommonUploadService;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
/**
* @className:UploadFileController
* @author:cwchen
* @date:2025-10-16-13:43
* @version:1.0
* @description:文件上传公共方法
*/
@RestController
@RequestMapping("/commonUpload")
@Slf4j
public class CommonUploadController {
@Resource(name = "CommonUploadService")
private CommonUploadService service;
@ApiOperation(value = "上传小文件---5M以内", notes = "上传文件无需OCR识别")
@PostMapping(value = "uploadSmallFile")
private AjaxResult uploadSmallFile(@RequestParam(name = "file",required = true) MultipartFile file,@RequestParam(name = "params",required = true)String params) throws Exception {
return service.uploadSmallFile(file,params);
}
@ApiOperation(value = "上传小文件---5M以内", notes = "上传文件并使用OCR识别")
@PostMapping(value = "uploadSmallFileByOcr")
private AjaxResult uploadSmallFileByOcr(@RequestParam(name = "file",required = false) MultipartFile file,String params){
return service.uploadSmallFileByOcr(file,params);
}
}

View File

@ -1,12 +0,0 @@
package com.bonus.web.controller.common;
/**
* @className:UploadFileController
* @author:cwchen
* @date:2025-10-16-13:43
* @version:1.0
* @description:文件上传
*/
public class CommonUploadFileController {
}

View File

@ -1,23 +1,24 @@
package com.bonus.web.controller.file; package com.bonus.web.controller.file;
import com.bonus.common.core.domain.AjaxResult; import com.bonus.common.core.domain.AjaxResult;
import com.bonus.common.domain.file.po.ResourceFilePo;
import com.bonus.common.domain.file.vo.SysFile; import com.bonus.common.domain.file.vo.SysFile;
import com.bonus.common.domain.ocr.dto.OcrRequest; import com.bonus.common.domain.ocr.dto.OcrRequest;
import com.bonus.common.domain.ocr.vo.OcrResponse; import com.bonus.common.domain.ocr.vo.OcrResponse;
import com.bonus.file.config.MinioConfig; import com.bonus.file.config.MinioConfig;
import com.bonus.file.service.FileUploadService; import com.bonus.file.service.FileUploadService;
import com.bonus.file.service.SourceFileService;
import com.bonus.file.util.FileUtil; import com.bonus.file.util.FileUtil;
import com.bonus.file.util.MinioUtil; import com.bonus.file.util.MinioUtil;
import com.bonus.ocr.service.OcrService; import com.bonus.ocr.service.OcrService;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.List;
/** /**
* @className:FileUploadController * @className:FileUploadController
@ -33,6 +34,9 @@ public class FileUploadController {
@Resource(name = "FileUploadService") @Resource(name = "FileUploadService")
private FileUploadService fileUploadService; private FileUploadService fileUploadService;
@Resource(name = "SourceFileService")
private SourceFileService sourceFileService;
@Resource(name = "OcrService") @Resource(name = "OcrService")
private OcrService ocrService; private OcrService ocrService;
@ -69,4 +73,12 @@ public class FileUploadController {
System.err.println("文件对象:{}" + file); System.err.println("文件对象:{}" + file);
return AjaxResult.success(); return AjaxResult.success();
} }
@PostMapping(value = "addFile")
private AjaxResult addFile(@RequestBody ResourceFilePo filePo) {
List<ResourceFilePo> list = new ArrayList<>();
list.add(filePo);
sourceFileService.saveResourceFile(list);
return AjaxResult.success();
}
} }

View File

@ -0,0 +1,108 @@
package com.bonus.web.service.common;
import com.alibaba.fastjson2.JSONObject;
import com.bonus.common.constant.Constants;
import com.bonus.common.core.domain.AjaxResult;
import com.bonus.common.domain.ocr.dto.OcrRequest;
import com.bonus.common.domain.ocr.vo.OcrResponse;
import com.bonus.file.config.MinioConfig;
import com.bonus.file.enums.UploadSuffixEnum;
import com.bonus.file.service.FileUploadService;
import com.bonus.file.util.FileUtil;
import com.bonus.file.util.MinioUtil;
import com.bonus.ocr.service.OcrService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* @className:CommonUploadService
* @author:cwchen
* @date:2025-10-17-16:37
* @version:1.0
* @description:文件上传公共方法实现层
*/
@Service(value = "CommonUploadService")
@Slf4j
public class CommonUploadService {
@Resource(name = "FileUploadService")
private FileUploadService fileUploadService;
@Resource(name = "OcrService")
private OcrService ocrService;
@Resource
private MinioConfig minioConfig;
@Resource
private MinioUtil minioUtil;
/**
* 上传小文件---5M以内 --- 上传文件无需OCR识别
* @param file
* @param params
* @return AjaxResult
* @author cwchen
* @date 2025/10/17 16:42
*/
public AjaxResult uploadSmallFile(MultipartFile file, String params) {
// params(json字符串) 参数需要传 suffix等参数
JSONObject jsonObj = JSONObject.parseObject(params);
// 获取文件前缀
String suffix = UploadSuffixEnum.getValueByKey(jsonObj.getString("suffix"));
// 生成文件路径
String uploadPath = FileUtil.generateDatePath(file, suffix).replace("\\", "/");
// 上传结果
String uploadResult = fileUploadService.uploadFile(file, uploadPath);
if(StringUtils.isEmpty(uploadResult)){
return AjaxResult.error(Constants.UPLOAD_ERROR);
}
return AjaxResult.success(Constants.UPLOAD_SUCCESS,uploadPath);
}
/**
* 上传小文件---5M以内 --- 上传文件并使用OCR识别
* @param file
* @param params
* @return AjaxResult
* @author cwchen
* @date 2025/10/17 16:42
*/
public AjaxResult uploadSmallFileByOcr(MultipartFile file, String params) {
// params(json字符串) 参数需要传 suffix文件保存前缀fields_jsonocr识别的参数["姓名","性别"]等参数
JSONObject jsonObj = JSONObject.parseObject(params);
// 获取文件前缀
String suffix = UploadSuffixEnum.getValueByKey(jsonObj.getString("suffix"));
// 生成文件路径
String uploadPath = FileUtil.generateDatePath(file, suffix).replace("\\", "/");
String uploadResult = fileUploadService.uploadFile(file, uploadPath);
if(StringUtils.isEmpty(uploadResult)){
return AjaxResult.error(Constants.UPLOAD_ERROR);
}
OcrResponse ocrResponse = null;
try {
// 获取Minio临时文件
File fileFromMinio = minioUtil.getFileFromMinio(minioConfig.getBucketName(), uploadPath);
// 创建OCR识别请求参数
OcrRequest ocrRequest = new OcrRequest();
ocrRequest.setFile(fileFromMinio);
ocrRequest.setType(FileUtil.getFileMimeType(file));
ocrRequest.setFields_json(jsonObj.getString("fields_json"));
// 调用ocr识别服务
ocrResponse = ocrService.callOcrService(ocrRequest);
} catch (Exception e) {
log.error(e.toString(),e.getMessage());
}
Map<String, Object> map = new HashMap<>(16);
map.put("uploadPath", uploadPath);
map.put("ocrResult", ocrResponse);
return AjaxResult.success(Constants.UPLOAD_SUCCESS,map);
}
}

View File

@ -4,7 +4,4 @@ minio:
endpoint: http://192.168.0.14:9090 endpoint: http://192.168.0.14:9090
access-key: minio access-key: minio
secret-key: bonus@admin123 secret-key: bonus@admin123
bucket-name: smart-bid bucket-name: smart-bid
# 文件上传前缀
uploadSuffix:
main_database: mainDatabase #主体库

View File

@ -45,6 +45,16 @@ public class Constants
*/ */
public static final String SUCCESS = "0"; public static final String SUCCESS = "0";
/**
* 文件上传成功标识
* */
public static final String UPLOAD_SUCCESS = "上传成功";
/**
* 文件上传失败标识
* */
public static final String UPLOAD_ERROR = "上传失败";
/** /**
* 通用失败标识 * 通用失败标识
*/ */
@ -170,4 +180,5 @@ public class Constants
*/ */
public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
"org.springframework", "org.apache", "com.bonus.common.utils.file", "com.bonus.common.config", "com.bonus.generator" }; "org.springframework", "org.apache", "com.bonus.common.utils.file", "com.bonus.common.config", "com.bonus.generator" };
} }

View File

@ -0,0 +1,49 @@
package com.bonus.file.enums;
public enum UploadSuffixEnum {
/**
* 主体库
*/
MAIN_DATABASE("main_database", "mainDatabase"),
/**
* 业绩库
*/
PERFORMANCE_DATABASE("performance_database", "performanceDatabase"),
/**
* 人员库
*/
PERSONNEL_DATABASE("personnel_database", "personnelDatabase"),
/**
* 财务库
*/
FINANCIAL_TREASURY("financial_treasury", "financialTreasury"),
/**
* 资质库
*/
QUALIFICATION_DATABASE("qualification_database", "qualificationDatabase"),
/**
* 业绩库
*/
TECHNICAL_SOLUTION_DATABASE("technical_solution_database", "technicalSolutionDatabase"),
/**
* 工器具库
*/
TOOLS_DATABASE("tools_database", "toolsDatabase");
private final String key;
private final String value;
UploadSuffixEnum(String key, String value) {
this.key = key;
this.value = value;
}
public static String getValueByKey(String key) {
for (UploadSuffixEnum suffix : values()) {
if (suffix.key.equals(key)) {
return suffix.value;
}
}
return MAIN_DATABASE.value; // 默认值
}
}

View File

@ -27,7 +27,7 @@ public class FileUploadService {
private MinioConfig minioConfig; private MinioConfig minioConfig;
/** /**
* 上传文件 * 上传文件 - 5M以内
* @param file * @param file
* @return * @return
*/ */
@ -37,8 +37,8 @@ public class FileUploadService {
return minioConfig.getBucketName(); return minioConfig.getBucketName();
}catch (Exception e){ }catch (Exception e){
log.error(e.toString(),e); log.error(e.toString(),e);
return null;
} }
return null;
} }
/** /**
@ -57,7 +57,7 @@ public class FileUploadService {
} }
/** /**
* 上传大文件-分片上传 * 上传大文件-分片上传 - 5M以上
* @param file * @param file
* @return * @return
*/ */

View File

@ -41,4 +41,60 @@ public class FileUtil {
} }
return filename.substring(filename.lastIndexOf(".")); return filename.substring(filename.lastIndexOf("."));
} }
/**
* 根据MultipartFile获取MIME类型
*/
public static String getFileMimeType(MultipartFile file) {
if (file == null || file.isEmpty()) {
return "application/octet-stream";
}
// 根据文件名后缀判断
String originalFilename = file.getOriginalFilename();
if (originalFilename != null) {
return getMimeTypeByFilename(originalFilename);
}
return "application/octet-stream";
}
/**
* 根据文件名获取MIME类型
*/
private static String getMimeTypeByFilename(String filename) {
if (filename == null) {
return "application/octet-stream";
}
String extension = filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
switch (extension) {
case "png":
return "image/png";
case "jpg":
case "jpeg":
return "image/jpeg";
case "gif":
return "image/gif";
case "bmp":
return "image/bmp";
case "webp":
return "image/webp";
case "pdf":
return "application/pdf";
case "doc":
return "application/msword";
case "docx":
return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
case "xls":
return "application/vnd.ms-excel";
case "xlsx":
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
case "txt":
return "text/plain";
default:
return "application/octet-stream";
}
}
} }

View File

@ -16,6 +16,10 @@ import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.*; import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List; import java.util.List;
@ -504,33 +508,23 @@ public class MinioUtil {
* @date 2025/10/16 17:32 * @date 2025/10/16 17:32
*/ */
public File getFileFromMinio(String bucketName, String objectName) throws Exception { public File getFileFromMinio(String bucketName, String objectName) throws Exception {
// 创建临时目录如果不存在 Path tempDir = Paths.get(System.getProperty("java.io.tmpdir"), "minio_downloads");
File tempDir = new File(System.getProperty("java.io.tmpdir"), "minio_downloads"); Files.createDirectories(tempDir);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
String safeFileName = getSafeFileName(objectName); String safeFileName = getSafeFileName(objectName);
File tempFile = new File(tempDir, "minio_" + System.currentTimeMillis() + "_" + safeFileName); String fileName = "minio_" + System.currentTimeMillis() + "_" + safeFileName;
Path tempFilePath = tempDir.resolve(fileName);
try (InputStream stream = minioClient.getObject( try (InputStream stream = minioClient.getObject(
GetObjectArgs.builder() GetObjectArgs.builder()
.bucket(bucketName) .bucket(bucketName)
.object(objectName) .object(objectName)
.build()); .build())) {
FileOutputStream outputStream = new FileOutputStream(tempFile)) {
byte[] buffer = new byte[8192]; Files.copy(stream, tempFilePath, StandardCopyOption.REPLACE_EXISTING);
int bytesRead; return tempFilePath.toFile();
while ((bytesRead = stream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
return tempFile;
} catch (Exception e) { } catch (Exception e) {
if (tempFile.exists()) { Files.deleteIfExists(tempFilePath);
tempFile.delete();
}
throw e; throw e;
} }
} }