package com.takai.ai.utils; import com.takai.ai.domain.TakaiSysOss; import com.takai.ai.domain.TakaiSysOssConfig; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import io.minio.*; import io.minio.messages.Bucket; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.multipart.MultipartFile; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.UUID; @Component public class MinioUtil { private static final Logger logger = LoggerFactory.getLogger(MinioUtil.class); private final MinioClient minioClient; private final String bucketName; @Autowired public MinioUtil(MinioClient minioClient, String bucketName) throws Exception{ this.minioClient = minioClient; this.bucketName = bucketName; initializeBucket(); } private void initializeBucket() throws Exception { if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } } /** * 批量上传文件 * @param files 文件列表 * @return 上传成功的文件URL列表 */ public List uploadMultiple(MultipartFile[] files) throws Exception { // try { // TakaiSysOss ossVo = upload(files); // return ossVo; // } catch (Exception e) { // // 记录失败文件信息,但继续处理其他文件 // System.err.println("文件上传失败: " + files.getOriginalFilename() + ", 原因: " + e.getMessage()); // } List result = new ArrayList<>(); for (MultipartFile file : files) { if (file.isEmpty()) { continue; } try { TakaiSysOss ossVo = upload(file); result.add(ossVo); } catch (Exception e) { // 记录失败文件信息,但继续处理其他文件 System.err.println("文件上传失败: " + file.getOriginalFilename() + ", 原因: " + e.getMessage()); } } return result; } /** * 检查存储桶是否存在 */ public boolean bucketExists(String bucketName) throws Exception { return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); } /** * 创建存储桶 */ public void makeBucket(String bucketName) throws Exception { if (!bucketExists(bucketName)) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); } } /** * 列出所有存储桶 */ public List listBuckets() throws Exception { return minioClient.listBuckets(); } /** * 上传文件 * @param file 文件对象 * @return 文件访问URL */ public TakaiSysOss upload(MultipartFile file) throws Exception { // 如果存储桶不存在则创建 makeBucket(bucketName); // 生成日期目录路径 yyyy/MM/dd String dateDir = new SimpleDateFormat("yyyy/MM/dd").format(new Date()); // 生成唯一文件名 String originalFilename = file.getOriginalFilename(); // String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf(".")); // String fileName = dateDir + "/" + originalFilename; String fileName = originalFilename; // 上传文件 try (InputStream inputStream = file.getInputStream()) { minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(fileName) .stream(inputStream, file.getSize(), -1) .contentType(file.getContentType()) .build()); logger.info("文件上传成功: " + fileName); SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1); long ossId = snowflakeDigitGenerator.nextId(); String url = minioClient.getObjectUrl(bucketName, fileName); TakaiSysOss oss = new TakaiSysOss(); oss.setOssId("a"+ossId); oss.setUrl(url); oss.setFileName(fileName); oss.setOriginalName(originalFilename); oss.setService("service"); oss.setFileSuffix(fileName.substring(fileName.lastIndexOf("."))); return oss; } } /** * 下载文件 */ public InputStream download(String bucketName, String objectName) throws Exception { return minioClient.getObject( GetObjectArgs.builder() .bucket(bucketName) .object(objectName) .build()); } /** * 删除文件 */ public void remove(String bucketName, String objectName) throws Exception { minioClient.removeObject( RemoveObjectArgs.builder() .bucket(bucketName) .object(objectName) .build()); } /** * 获取文件URL */ public String getFileUrl(String bucketName, String objectName) throws Exception { return minioClient.getObjectUrl(bucketName, objectName); } }