From 23747f5f0a29094fa3794c8a168fdaf460d01c43 Mon Sep 17 00:00:00 2001 From: cwchen <1048842385@qq.com> Date: Thu, 16 Oct 2025 17:54:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E9=9B=86=E6=88=90=20minio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/file/FileUploadController.java | 38 +++++++-- .../src/main/resources/application-file.yml | 2 +- .../src/main/resources/application.yml | 2 +- .../bonus/common/domain/file/vo/SysFile.java | 2 + .../bonus/file/service/FileUploadService.java | 27 ++++++- .../java/com/bonus/file/util/FileUtil.java | 2 +- .../java/com/bonus/file/util/MinioUtil.java | 77 +++++++++++++++++-- .../com/bonus/ocr/service/OcrService.java | 7 ++ 8 files changed, 143 insertions(+), 14 deletions(-) diff --git a/bonus-admin/src/main/java/com/bonus/web/controller/file/FileUploadController.java b/bonus-admin/src/main/java/com/bonus/web/controller/file/FileUploadController.java index e798f75..a6a58b2 100644 --- a/bonus-admin/src/main/java/com/bonus/web/controller/file/FileUploadController.java +++ b/bonus-admin/src/main/java/com/bonus/web/controller/file/FileUploadController.java @@ -1,20 +1,23 @@ package com.bonus.web.controller.file; import com.bonus.common.core.domain.AjaxResult; +import com.bonus.common.domain.file.vo.SysFile; 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.service.FileUploadService; import com.bonus.file.util.FileUtil; +import com.bonus.file.util.MinioUtil; import com.bonus.ocr.service.OcrService; import org.springframework.beans.factory.annotation.Value; 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; import java.io.File; -import java.io.IOException; /** * @className:FileUploadController @@ -30,15 +33,40 @@ public class FileUploadController { @Resource(name = "FileUploadService") private FileUploadService fileUploadService; + @Resource(name = "OcrService") + private OcrService ocrService; + @Value("${uploadSuffix.main_database}") private String uploadSuffix; + @Resource + private MinioConfig minioConfig; + + @Resource + private MinioUtil minioUtil; + + @PostMapping(value = "uploadFile") - private AjaxResult ocrHandler(MultipartFile file) { + private AjaxResult uploadFile(@RequestParam(name = "file",required = false) MultipartFile file) throws Exception { // 生成文件路径 - String uploadPath = FileUtil.generateDatePath(file, uploadSuffix); - String s = fileUploadService.uploadFile(file,uploadPath); - System.err.println("文件路径" + s); + String uploadPath = FileUtil.generateDatePath(file, uploadSuffix).replace("\\", "/"); + fileUploadService.uploadFile(file,uploadPath); + System.err.println("文件路径----" + uploadPath); + + // 获取临时路径 + File fileFromMinio = minioUtil.getFileFromMinio(minioConfig.getBucketName(), "mainDatabase/2025/10/16/75b562e0-0a2f-4453-bcc9-f77cee28ca0e.png"); + OcrRequest ocrRequest = new OcrRequest(); + ocrRequest.setFile(fileFromMinio); + ocrRequest.setType("image/png"); + ocrRequest.setFields_json("[\"姓名\", \"公民身份号码\"]"); + OcrResponse ocrResponse = ocrService.callOcrService(ocrRequest); + return AjaxResult.success(ocrResponse); + } + + @PostMapping(value = "getFile") + private AjaxResult getFile() { + SysFile file = fileUploadService.getFile("mainDatabase/2025/10/16/75b562e0-0a2f-4453-bcc9-f77cee28ca0e.png"); + System.err.println("文件对象:{}" + file); return AjaxResult.success(); } } diff --git a/bonus-admin/src/main/resources/application-file.yml b/bonus-admin/src/main/resources/application-file.yml index 7d1c1db..ccb31ec 100644 --- a/bonus-admin/src/main/resources/application-file.yml +++ b/bonus-admin/src/main/resources/application-file.yml @@ -7,4 +7,4 @@ minio: bucket-name: smart-bid # 文件上传前缀 uploadSuffix: - main_database: main_database #主体库 \ No newline at end of file + main_database: mainDatabase #主体库 \ No newline at end of file diff --git a/bonus-admin/src/main/resources/application.yml b/bonus-admin/src/main/resources/application.yml index 3d001f7..754a32a 100644 --- a/bonus-admin/src/main/resources/application.yml +++ b/bonus-admin/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: @profiles.active@,druid,ocr + active: @profiles.active@,druid,ocr,file # 解决SpringBoot 2.6+与SpringFox兼容性问题 mvc: pathmatch: diff --git a/bonus-common/src/main/java/com/bonus/common/domain/file/vo/SysFile.java b/bonus-common/src/main/java/com/bonus/common/domain/file/vo/SysFile.java index 4cb49ea..541e79b 100644 --- a/bonus-common/src/main/java/com/bonus/common/domain/file/vo/SysFile.java +++ b/bonus-common/src/main/java/com/bonus/common/domain/file/vo/SysFile.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; +import org.apache.ibatis.type.Alias; /** * 文件信息 @@ -12,6 +13,7 @@ import org.apache.commons.lang3.builder.ToStringStyle; */ @Data @Builder +@Alias("ServerSysFile") public class SysFile { /** diff --git a/bonus-file/src/main/java/com/bonus/file/service/FileUploadService.java b/bonus-file/src/main/java/com/bonus/file/service/FileUploadService.java index ae6c14e..d7b3148 100644 --- a/bonus-file/src/main/java/com/bonus/file/service/FileUploadService.java +++ b/bonus-file/src/main/java/com/bonus/file/service/FileUploadService.java @@ -8,6 +8,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; /** * @className:FileUploadService @@ -57,7 +58,7 @@ public class FileUploadService { } /** - * 上传大文件 + * 上传大文件-分片上传 * @param file * @return */ @@ -70,4 +71,28 @@ public class FileUploadService { return null; } + public SysFile getFile(String filePath) { + try{ + String fileUrl = minioUtil.getFileUrl(minioConfig.getBucketName(), filePath, 60 * 60 * 12); + String lsUrl= fileUrl.replace(minioConfig.getEndpoint(),minioConfig.getUrl()); + String url = minioConfig.getUrl() + File.separator + filePath; + log.info("临时路径:{}",lsUrl); + return SysFile.builder() + .name("文件名称") + .url(url).build(); + }catch (Exception e){ + log.error(e.toString(),e); + } + return null; + } + + public SysFile getFile2(String filePath) { + try{ + minioUtil.getFileUrl(null,null); + }catch (Exception e){ + log.error(e.toString(),e); + } + return null; + } + } diff --git a/bonus-file/src/main/java/com/bonus/file/util/FileUtil.java b/bonus-file/src/main/java/com/bonus/file/util/FileUtil.java index ca0e4da..a5012de 100644 --- a/bonus-file/src/main/java/com/bonus/file/util/FileUtil.java +++ b/bonus-file/src/main/java/com/bonus/file/util/FileUtil.java @@ -28,7 +28,7 @@ public class FileUtil { String fileExtension = getFileExtension(originalFilename); String uniqueFileName = UUID.randomUUID().toString() + fileExtension; - // 构建完整路径 + // 构建完整路径:baseDir/年/月/日/UUID.扩展名 return Paths.get(baseDir, datePath, uniqueFileName).toString(); } diff --git a/bonus-file/src/main/java/com/bonus/file/util/MinioUtil.java b/bonus-file/src/main/java/com/bonus/file/util/MinioUtil.java index eee40c7..6cb5a57 100644 --- a/bonus-file/src/main/java/com/bonus/file/util/MinioUtil.java +++ b/bonus-file/src/main/java/com/bonus/file/util/MinioUtil.java @@ -15,9 +15,7 @@ import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import javax.annotation.Resource; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; +import java.io.*; import java.util.ArrayList; import java.util.Base64; import java.util.List; @@ -296,13 +294,13 @@ public class MinioUtil { } /** - * 获取文件bast64 + * 获取文件base64 * @param bucketName * @param path * @return */ @SneakyThrows(Exception.class) - public String getMinioBast64(String bucketName,String path) { + public String getMinioBase64(String bucketName,String path) { InputStream inputStream= minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(path).build()); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; @@ -497,5 +495,74 @@ public class MinioUtil { } } + /** + * 生成File临时对象 + * @param bucketName + * @param objectName + * @return File + * @author cwchen + * @date 2025/10/16 17:32 + */ + public File getFileFromMinio(String bucketName, String objectName) throws Exception { + // 创建临时目录(如果不存在) + File tempDir = new File(System.getProperty("java.io.tmpdir"), "minio_downloads"); + if (!tempDir.exists()) { + tempDir.mkdirs(); + } + String safeFileName = getSafeFileName(objectName); + File tempFile = new File(tempDir, "minio_" + System.currentTimeMillis() + "_" + safeFileName); + + try (InputStream stream = minioClient.getObject( + GetObjectArgs.builder() + .bucket(bucketName) + .object(objectName) + .build()); + FileOutputStream outputStream = new FileOutputStream(tempFile)) { + + byte[] buffer = new byte[8192]; + int bytesRead; + while ((bytesRead = stream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + return tempFile; + } catch (Exception e) { + if (tempFile.exists()) { + tempFile.delete(); + } + throw e; + } + } + + /** + * 获取安全的文件名,移除路径和非法字符 + */ + private String getSafeFileName(String objectName) { + if (objectName == null || objectName.isEmpty()) { + return "unknown_file"; + } + + // 提取文件名(去掉路径) + String fileName = objectName; + fileName = fileName.substring(fileName.lastIndexOf("/") + 1); + fileName = fileName.substring(fileName.lastIndexOf("\\") + 1); + + // 移除Windows文件名中的非法字符 + fileName = fileName.replaceAll("[\\\\/:*?\"<>|]", "_"); + + // 限制文件名长度(避免文件名过长) + if (fileName.length() > 100) { + int dotIndex = fileName.lastIndexOf("."); + if (dotIndex > 0) { + String name = fileName.substring(0, Math.min(50, dotIndex)); + String extension = fileName.substring(dotIndex); + fileName = name + extension; + } else { + fileName = fileName.substring(0, 50); + } + } + + return fileName.isEmpty() ? "minio_file" : fileName; + } } diff --git a/bonus-ocr/src/main/java/com/bonus/ocr/service/OcrService.java b/bonus-ocr/src/main/java/com/bonus/ocr/service/OcrService.java index 122fa2e..d9ee829 100644 --- a/bonus-ocr/src/main/java/com/bonus/ocr/service/OcrService.java +++ b/bonus-ocr/src/main/java/com/bonus/ocr/service/OcrService.java @@ -117,6 +117,13 @@ public class OcrService { log.error("调用OCR服务失败", e); throw new IOException("OCR服务调用失败: " + e.getMessage(), e); } finally { + // 清理临时文件 + if (ocrRequest.getFile() != null && ocrRequest.getFile().exists()) { + boolean deleted = ocrRequest.getFile().delete(); + if (!deleted) { + log.warn("临时文件删除失败: {}", ocrRequest.getFile().getAbsolutePath()); + } + } httpPost.releaseConnection(); } }