MinioUtil.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. package com.takai.ai.utils;
  2. import com.takai.ai.domain.TakaiSysOss;
  3. import com.takai.ai.domain.TakaiSysOssConfig;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.stereotype.Component;
  7. import io.minio.*;
  8. import io.minio.messages.Bucket;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.web.multipart.MultipartFile;
  11. import java.io.InputStream;
  12. import java.text.SimpleDateFormat;
  13. import java.util.ArrayList;
  14. import java.util.Date;
  15. import java.util.List;
  16. import java.util.UUID;
  17. @Component
  18. public class MinioUtil {
  19. private static final Logger logger = LoggerFactory.getLogger(MinioUtil.class);
  20. private final MinioClient minioClient;
  21. private final String bucketName;
  22. @Autowired
  23. public MinioUtil(MinioClient minioClient, String bucketName) throws Exception{
  24. this.minioClient = minioClient;
  25. this.bucketName = bucketName;
  26. initializeBucket();
  27. }
  28. private void initializeBucket() throws Exception {
  29. if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
  30. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  31. }
  32. }
  33. /**
  34. * 批量上传文件
  35. * @param files 文件列表
  36. * @return 上传成功的文件URL列表
  37. */
  38. public List<TakaiSysOss> uploadMultiple(MultipartFile[] files) throws Exception {
  39. // try {
  40. // TakaiSysOss ossVo = upload(files);
  41. // return ossVo;
  42. // } catch (Exception e) {
  43. // // 记录失败文件信息,但继续处理其他文件
  44. // System.err.println("文件上传失败: " + files.getOriginalFilename() + ", 原因: " + e.getMessage());
  45. // }
  46. List<TakaiSysOss> result = new ArrayList<>();
  47. for (MultipartFile file : files) {
  48. if (file.isEmpty()) {
  49. continue;
  50. }
  51. try {
  52. TakaiSysOss ossVo = upload(file);
  53. result.add(ossVo);
  54. } catch (Exception e) {
  55. // 记录失败文件信息,但继续处理其他文件
  56. System.err.println("文件上传失败: " + file.getOriginalFilename() + ", 原因: " + e.getMessage());
  57. }
  58. }
  59. return result;
  60. }
  61. /**
  62. * 检查存储桶是否存在
  63. */
  64. public boolean bucketExists(String bucketName) throws Exception {
  65. return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
  66. }
  67. /**
  68. * 创建存储桶
  69. */
  70. public void makeBucket(String bucketName) throws Exception {
  71. if (!bucketExists(bucketName)) {
  72. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  73. }
  74. }
  75. /**
  76. * 列出所有存储桶
  77. */
  78. public List<Bucket> listBuckets() throws Exception {
  79. return minioClient.listBuckets();
  80. }
  81. /**
  82. * 上传文件
  83. * @param file 文件对象
  84. * @return 文件访问URL
  85. */
  86. public TakaiSysOss upload(MultipartFile file) throws Exception {
  87. // 如果存储桶不存在则创建
  88. makeBucket(bucketName);
  89. // 生成日期目录路径 yyyy/MM/dd
  90. String dateDir = new SimpleDateFormat("yyyy/MM/dd").format(new Date());
  91. // 生成唯一文件名
  92. String originalFilename = file.getOriginalFilename();
  93. // String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
  94. // String fileName = dateDir + "/" + originalFilename;
  95. String fileName = originalFilename;
  96. // 上传文件
  97. try (InputStream inputStream = file.getInputStream()) {
  98. minioClient.putObject(
  99. PutObjectArgs.builder()
  100. .bucket(bucketName)
  101. .object(fileName)
  102. .stream(inputStream, file.getSize(), -1)
  103. .contentType(file.getContentType())
  104. .build());
  105. logger.info("文件上传成功: " + fileName);
  106. SnowflakeDigitGenerator snowflakeDigitGenerator = new SnowflakeDigitGenerator(1, 1);
  107. long ossId = snowflakeDigitGenerator.nextId();
  108. String url = minioClient.getObjectUrl(bucketName, fileName);
  109. TakaiSysOss oss = new TakaiSysOss();
  110. oss.setOssId("a"+ossId);
  111. oss.setUrl(url);
  112. oss.setFileName(fileName);
  113. oss.setOriginalName(originalFilename);
  114. oss.setService("service");
  115. oss.setFileSuffix(fileName.substring(fileName.lastIndexOf(".")));
  116. return oss;
  117. }
  118. }
  119. /**
  120. * 下载文件
  121. */
  122. public InputStream download(String bucketName, String objectName) throws Exception {
  123. return minioClient.getObject(
  124. GetObjectArgs.builder()
  125. .bucket(bucketName)
  126. .object(objectName)
  127. .build());
  128. }
  129. /**
  130. * 删除文件
  131. */
  132. public void remove(String bucketName, String objectName) throws Exception {
  133. minioClient.removeObject(
  134. RemoveObjectArgs.builder()
  135. .bucket(bucketName)
  136. .object(objectName)
  137. .build());
  138. }
  139. /**
  140. * 获取文件URL
  141. */
  142. public String getFileUrl(String bucketName, String objectName) throws Exception {
  143. return minioClient.getObjectUrl(bucketName, objectName);
  144. }
  145. }