MinioDao.java 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. package top.lifuquan.dao;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6. import java.util.UUID;
  7. import java.util.concurrent.TimeUnit;
  8. import org.springframework.stereotype.Repository;
  9. import org.springframework.web.multipart.MultipartFile;
  10. import io.minio.BucketExistsArgs;
  11. import io.minio.GetPresignedObjectUrlArgs;
  12. import io.minio.ListObjectsArgs;
  13. import io.minio.MakeBucketArgs;
  14. import io.minio.MinioClient;
  15. import io.minio.PutObjectArgs;
  16. import io.minio.Result;
  17. import io.minio.http.Method;
  18. import io.minio.messages.Bucket;
  19. import io.minio.messages.Item;
  20. import lombok.extern.slf4j.Slf4j;
  21. import top.lifuquan.exception.minio.MinioClientGetFailed;
  22. import top.lifuquan.exception.minio.MinioClientPutFailed;
  23. @Slf4j
  24. @Repository
  25. public class MinioDao {
  26. private final MinioClient minioClient;
  27. public MinioDao(MinioClient minioClient) {
  28. this.minioClient = minioClient;
  29. log.info("已完成{}装配", this.getClass().getName());
  30. }
  31. /*
  32. * 获取文件名列表
  33. */
  34. public List<String> listFileNames(String bucketName) throws MinioClientGetFailed {
  35. return listFileNames(bucketName, null);
  36. }
  37. /*
  38. * 获取文件名列表
  39. */
  40. public List<String> listFileNames(String bucketName, String prefix) throws MinioClientGetFailed {
  41. Iterable<Result<Item>> results = minioClient
  42. .listObjects(ListObjectsArgs.builder().bucket(bucketName).prefix(prefix).build());
  43. List<String> result = new ArrayList<>();
  44. try {
  45. for (Result<Item> item : results) {
  46. result.add(item.get().objectName());
  47. }
  48. } catch (Exception e) {
  49. // result.get() 异常
  50. e.printStackTrace();
  51. throw new MinioClientGetFailed("通过bucket名称 {} 获取内部元素列表失败", bucketName);
  52. }
  53. return result;
  54. }
  55. /*
  56. * 通过bucket名称打印元素列表
  57. */
  58. public void printItemsByBucketName(String bucketName) throws MinioClientGetFailed {
  59. Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
  60. Item item;
  61. try {
  62. for (Result<Item> result : results) {
  63. item = result.get();
  64. // 路径有很多属性是null
  65. if (item.isDir()) {
  66. log.info("路径--属性打印-------- objectName: {}-- size:{}-- owner:{}-- isLatest:{}-- isDir:{}",
  67. item.objectName(), item.size(), item.owner(), item.isLatest(), item.isDir());
  68. } else {
  69. log.info("元素--属性打印-------- objectName: {}-- lastModified:{}-- etag:{}-- size:{}--"
  70. + " storageClass:{}-- owner:{}-- userMetadata:{}-- isLatest:{}--"
  71. + " versionId:{}-- isDir:{}-- isDeleteMarker:{}",
  72. item.objectName(),
  73. item.lastModified(),
  74. item.etag(),
  75. item.size(),
  76. item.storageClass(),
  77. item.owner().displayName(),
  78. item.userMetadata(),
  79. item.isLatest(),
  80. item.versionId(),
  81. item.isDir(),
  82. item.isDeleteMarker());
  83. }
  84. }
  85. } catch (Exception e) {
  86. // result.get() 异常
  87. e.printStackTrace();
  88. throw new MinioClientGetFailed("通过bucket名称 {} 获取内部元素列表失败", bucketName);
  89. }
  90. }
  91. /*
  92. * 获取全部的bucket名称
  93. */
  94. public List<String> listBucketNames() throws MinioClientGetFailed {
  95. try {
  96. List<Bucket> buckets = minioClient.listBuckets();
  97. List<String> result = new ArrayList<>();
  98. for (Bucket bucket : buckets) {
  99. result.add(bucket.name());
  100. }
  101. return result;
  102. } catch (Exception e) {
  103. e.printStackTrace();
  104. throw new MinioClientGetFailed("获取bucket列表失败");
  105. }
  106. }
  107. /*
  108. * 上传文件
  109. * 自动添加日期,格式20221109/
  110. * prefix为null 最终格式 20221109/fileName
  111. * prefix为abc 最终格式为 abc/20221109/fileName
  112. * minio上传完全相同路径文件会覆盖,在文件名之前加上一个uuid字符串
  113. * 返回文件在bucket中的完整路径
  114. */
  115. public String upload(MultipartFile file, String bucketName, String prefix) {
  116. // 在原始文件基础上添加日期和前缀
  117. String filePath;
  118. DateFormat format = new SimpleDateFormat("yyyyMMdd/");
  119. String uuid = UUID.randomUUID().toString().replace("-", "");
  120. if (prefix != null) {
  121. prefix = prefix.endsWith("/") ? prefix : prefix + "/";
  122. filePath = prefix + format.format(System.currentTimeMillis()) + uuid + "-" + file.getOriginalFilename();
  123. } else {
  124. filePath = format.format(System.currentTimeMillis()) + uuid + "-" + file.getOriginalFilename();
  125. }
  126. PutObjectArgs args;
  127. try {
  128. args = PutObjectArgs
  129. .builder()
  130. .bucket(bucketName)
  131. .object(filePath)
  132. .stream(file.getInputStream(), file.getSize(), -1)
  133. .contentType(file.getContentType())
  134. .build();
  135. minioClient.putObject(args);
  136. return filePath;
  137. } catch (Exception e) {
  138. // file.getInputStream() 异常 IOException
  139. // minioClient.putObject(args) 异常 一大堆
  140. e.printStackTrace();
  141. return null;
  142. }
  143. }
  144. /*
  145. * 获取download链接,默认7天有效
  146. */
  147. public String download(String bucketName, String filePath) {
  148. GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs
  149. .builder()
  150. .method(Method.GET)
  151. .bucket(bucketName)
  152. .object(filePath)
  153. .expiry(7, TimeUnit.DAYS)
  154. .build();
  155. try {
  156. return minioClient.getPresignedObjectUrl(args);
  157. } catch (Exception e) {
  158. e.printStackTrace();
  159. }
  160. return null;
  161. }
  162. /*
  163. * 检查bucket是否存在
  164. */
  165. public boolean bucketExists(String bucketName) throws Exception {
  166. try {
  167. return minioClient.bucketExists(BucketExistsArgs
  168. .builder()
  169. .bucket(bucketName)
  170. .build());
  171. } catch (IllegalArgumentException e) {
  172. throw new MinioClientGetFailed("输入的bucketName--{}--不符合Amazon S3规范: {}", bucketName, e.getMessage());
  173. } catch (Exception e) {
  174. e.printStackTrace();
  175. throw new MinioClientGetFailed("查询BucketExists出错--{}--{}", bucketName, e.getMessage());
  176. }
  177. }
  178. /*
  179. * 创建bucket
  180. */
  181. public void makeBucket(String bucketName) throws Exception {
  182. try {
  183. minioClient.makeBucket(MakeBucketArgs
  184. .builder()
  185. .bucket(bucketName)
  186. .build());
  187. } catch (IllegalArgumentException e) {
  188. e.printStackTrace();
  189. throw new MinioClientPutFailed("输入的bucketName--{}--不符合Amazon S3规范: {}", bucketName, e.getMessage());
  190. } catch (Exception e) {
  191. e.printStackTrace();
  192. throw new MinioClientPutFailed("Bucket--{}--创建失败", bucketName);
  193. }
  194. }
  195. }