当前位置:   article > 正文

SpringBoot集成Minio

SpringBoot集成Minio
  1. public class MinIOConfig {
  2. @Autowired
  3. private MinIOConfigProperties minIOConfigProperties;
  4. @Bean
  5. public MinioClient buildMinioClient() {
  6. return MinioClient
  7. .builder()
  8. .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
  9. .endpoint(minIOConfigProperties.getEndpoint())
  10. .build();
  11. }
  12. }
  1. @Data
  2. @ConfigurationProperties(prefix = "minio")
  3. @Component
  4. public class MinIOConfigProperties implements Serializable {
  5. private String accessKey;
  6. private String secretKey;
  7. private String bucket;
  8. private String endpoint;
  9. private String readPath;
  10. }
  1. public interface MinioFileService {
  2. /**
  3. * 下载文件
  4. * @param pathUrl
  5. * @param response
  6. */
  7. void downLoadFile(String pathUrl, HttpServletResponse response) ;
  8. /**
  9. * 上传文件到指定tong桶下面的指定目录
  10. * @param bucketName 桶名称
  11. * @param folderPath 目录名称
  12. * @param file 文件
  13. */
  14. String downLoadFileByPath(String bucketName,String folderPath, MultipartFile file) throws Exception;
  15. /**
  16. * 上传文件
  17. * @param file
  18. * @return
  19. * @throws Exception
  20. */
  21. String uploadFile(File file) throws Exception;
  22. /**
  23. * 创建临时目录
  24. * @return
  25. */
  26. File createTempDir();
  27. /**
  28. * 删除文件
  29. * @param pathUrl
  30. */
  31. void delete(String pathUrl) ;
  32. /**
  33. * 列出所有bucket名称
  34. * @return
  35. * @throws Exception
  36. */
  37. List<String> listBucketNames() throws Exception;
  38. /**
  39. * 创建bucket
  40. * @param bucketName
  41. * @return
  42. * @throws Exception
  43. */
  44. boolean makeBucket(String bucketName) throws Exception;
  45. /**
  46. * 删除bucket
  47. * @param bucketName
  48. * @return
  49. * @throws Exception
  50. */
  51. boolean removeBucket(String bucketName) throws Exception;
  52. /**
  53. * 列出bucket的所有对象名称
  54. * @param bucketName
  55. * @return
  56. * @throws Exception
  57. */
  58. List<String> listObjectNames(String bucketName) throws Exception;
  59. Iterable<Result<Item>> listObjects(String bucketName) throws Exception;
  60. }
  1. @Slf4j
  2. @Import(MinIOConfig.class)
  3. @Service
  4. public class MinioFileServiceImpl implements MinioFileService {
  5. @Autowired
  6. private MinioClient minioClient;
  7. @Autowired
  8. private MinIOConfigProperties minIOConfigProperties;
  9. private final static String separator = "/";
  10. @Value("${Temporary_file_address}")
  11. private String Temporary_file_address;
  12. /**
  13. * 下载文件
  14. *
  15. * @param pathUrl 文件全路径
  16. * @return 文件流
  17. */
  18. @Override
  19. public void downLoadFile(String pathUrl, HttpServletResponse response) {
  20. String[] pathItems = pathUrl.split("/");
  21. String originFileName = pathItems[pathItems.length - 1];
  22. String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
  23. int index = key.indexOf(separator);
  24. //String bucket = key.substring(0,index);
  25. String filePath = key.substring(index + 1);
  26. InputStream inputStream = null;
  27. try {
  28. inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
  29. response.setHeader("Content-Disposition", "attachment;filename=" + originFileName);
  30. response.setContentType("application/force-download");
  31. response.setCharacterEncoding("UTF-8");
  32. IOUtils.copy(inputStream, response.getOutputStream());
  33. System.out.println("下载成功");
  34. } catch (Exception e) {
  35. log.error("minio down file error. pathUrl:{}", pathUrl);
  36. e.printStackTrace();
  37. } finally {
  38. try {
  39. inputStream.close();
  40. } catch (IOException e) {
  41. e.printStackTrace();
  42. }
  43. }
  44. }
  45. @Override
  46. public String downLoadFileByPath(String bucketName, String folderPath, MultipartFile file) throws Exception{
  47. String endpoint = minIOConfigProperties.getEndpoint();
  48. // 上传文件到指定文件夹
  49. String objectName = folderPath+"/" + file.getOriginalFilename();
  50. PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
  51. .bucket(bucketName)
  52. .contentType(file.getContentType())
  53. .stream(file.getInputStream(), file.getSize(), -1).build();
  54. minioClient.putObject(objectArgs);
  55. return endpoint + "/" + bucketName + "/" + objectName;
  56. }
  57. // @Override
  58. // public String uploadFile(MultipartFile file) throws Exception {
  59. // String bucketName = minIOConfigProperties.getBucket();
  60. // String endpoint = minIOConfigProperties.getEndpoint();
  61. // InputStream inputStream = file.getInputStream();
  62. // // 检查存储桶是否已经存在
  63. // boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
  64. // if (isExist) {
  65. // System.out.println("Bucket already exists.");
  66. // } else {
  67. // minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  68. // }
  69. // String originalFilename = file.getOriginalFilename();
  70. // //拼接生成新的UUID形式的文件名
  71. // String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) +
  72. // UUID.randomUUID().toString().replaceAll("-", "")
  73. // + originalFilename.substring(originalFilename.lastIndexOf("."));
  74. //
  75. // PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
  76. // .bucket(bucketName)
  77. // .contentType(file.getContentType())
  78. // .stream(inputStream, file.getSize(), -1).build();
  79. // minioClient.putObject(objectArgs);
  80. // inputStream.close();
  81. // //组装桶中文件的访问url
  82. // String resUrl = endpoint + "/" + bucketName + "/" + objectName;
  83. // return resUrl;
  84. // }
  85. @Override
  86. public String uploadFile(File file) throws Exception {
  87. String bucketName = minIOConfigProperties.getBucket();
  88. String endpoint = minIOConfigProperties.getEndpoint();
  89. try {
  90. // 检查存储桶是否已经存在
  91. if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
  92. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  93. }
  94. // 拼接生成新的UUID形式的文件名
  95. String objectName = new SimpleDateFormat("yyyy/MM/dd/").format(new Date()) +
  96. UUID.randomUUID().toString().replaceAll("-", "") +
  97. file.getName().substring(file.getName().lastIndexOf("."));
  98. // 上传
  99. minioClient.uploadObject(UploadObjectArgs.builder()
  100. .bucket(bucketName)
  101. .object(objectName)
  102. .filename(file.getAbsolutePath())
  103. .build());
  104. // 组装桶中文件的访问url
  105. return endpoint + "/" + bucketName + "/" + objectName;
  106. } catch (Exception e) {
  107. log.error("上传文件 {} 失败: {}", file.getName(), e.getMessage());
  108. e.printStackTrace();
  109. throw new ServiceException(1000000500, "上传文件失败:" + e);
  110. } finally {
  111. // 删除临时文件
  112. this.deleteTempFile(file);
  113. }
  114. }
  115. /**
  116. * 在应用启动时
  117. * 创建临时目录
  118. */
  119. @Override
  120. public File createTempDir() {
  121. String property = System.getProperty("user.home");
  122. // 生成或指定文件存储的目录
  123. File dir = new File(property);
  124. if (!dir.exists()) {
  125. dir.mkdirs();
  126. }
  127. return dir;
  128. }
  129. /**
  130. * 删除临时文件
  131. * @param file file
  132. */
  133. private void deleteTempFile(File file) {
  134. try {
  135. Files.deleteIfExists(Paths.get(file.getAbsolutePath()));
  136. } catch (IOException e) {
  137. log.error("删除临时文件失败: {}", file.getAbsolutePath(), e);
  138. }
  139. }
  140. /**
  141. * 删除文件
  142. *
  143. * @param pathUrl 文件全路径
  144. */
  145. @Override
  146. public void delete(String pathUrl) {
  147. String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
  148. int index = key.indexOf(separator);
  149. String bucket = key.substring(0, index);
  150. String filePath = key.substring(index + 1);
  151. // 删除Objects
  152. RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
  153. try {
  154. minioClient.removeObject(removeObjectArgs);
  155. } catch (Exception e) {
  156. log.error("minio remove file error. pathUrl:{}", pathUrl);
  157. e.printStackTrace();
  158. }
  159. }
  160. public List<Bucket> listBuckets()
  161. throws Exception {
  162. return minioClient.listBuckets();
  163. }
  164. public boolean bucketExists(String bucketName) throws Exception {
  165. boolean flag = minioClient.bucketExists( BucketExistsArgs.builder().bucket(bucketName).build());
  166. if (flag) {
  167. return true;
  168. }
  169. return false;
  170. }
  171. @Override
  172. public List<String> listBucketNames() throws Exception{
  173. List<Bucket> bucketList = listBuckets();
  174. List<String> bucketListName = new ArrayList<>();
  175. for (Bucket bucket : bucketList) {
  176. bucketListName.add(bucket.name());
  177. }
  178. return bucketListName;
  179. }
  180. @Override
  181. public boolean makeBucket(String bucketName) throws Exception{
  182. boolean flag = this.bucketExists(bucketName);
  183. if (!flag) {
  184. minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  185. return true;
  186. } else {
  187. return false;
  188. }
  189. }
  190. @Override
  191. public boolean removeBucket(String bucketName) throws Exception{
  192. boolean flag = bucketExists(bucketName);
  193. if (flag) {
  194. Iterable<Result<Item>> myObjects = listObjects(bucketName);
  195. for (Result<Item> result : myObjects) {
  196. Item item = result.get();
  197. // 有对象文件,则删除失败
  198. if (item.size() > 0) {
  199. return false;
  200. }
  201. }
  202. // 删除存储桶,注意,只有存储桶为空时才能删除成功。
  203. minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
  204. flag = bucketExists(bucketName);
  205. if (!flag) {
  206. return true;
  207. }
  208. }
  209. return false;
  210. }
  211. @Override
  212. public List<String> listObjectNames(String bucketName) throws Exception{
  213. List<String> listObjectNames = new ArrayList<>();
  214. boolean flag = bucketExists(bucketName);
  215. if (flag) {
  216. Iterable<Result<Item>> myObjects = listObjects(bucketName);
  217. for (Result<Item> result : myObjects) {
  218. Item item = result.get();
  219. listObjectNames.add(item.objectName());
  220. }
  221. }
  222. return listObjectNames;
  223. }
  224. public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {
  225. boolean flag = bucketExists(bucketName);
  226. if (flag) {
  227. return minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).build());
  228. }
  229. return null;
  230. }
  231. }
  1. public class MultipartConfigElement {
  2. @Bean
  3. public javax.servlet.MultipartConfigElement multipartConfigElement() {
  4. MultipartConfigFactory factory = new MultipartConfigFactory();
  5. factory.setLocation("/home/temp");
  6. return factory.createMultipartConfig();
  7. }
  8. }

添加依赖:

  1. <dependency>
  2. <groupId>io.minio</groupId>
  3. <artifactId>minio</artifactId>
  4. <version>7.1.0</version>
  5. </dependency>

配置application.yam文件:

  1. //application.yam文件
  2. minio:
  3. accesskey: xxxxxxxxxxxxxxxxxxxxxxx
  4. secretKey: xxxxxxxxxxxxxxxxxxxxx
  5. endpoint: http://xxxxxxxx:端口号
  6. readPath: http://xxxxxxxx:端口号
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/932045
推荐阅读
相关标签
  

闽ICP备14008679号