当前位置:   article > 正文

Minio安装及整合SpringBoot

minio安装
一. MinIO概述

官网地址:https://minio.org.cn

MinIO是一款基于Apache License v2.0开源协议的分布式文件系统(或者叫对象存储服务),可以做为云存储的解决方案用来保存海量的图片、视频、文档等。由于采用Golang实现,服务端可以工作在Windows、Linux、 OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令就可以运行起来。

MinIO兼容亚马逊S3(Simple Storage Service,简单存储服务)云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而且每个对象文件可以是任意大小,从几kb到最大5T不等。

 MinIO特点:

1. 高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率;
2. 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心;
3. SDK支持: 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持;
4. 支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配  置下,即使丢失1/2的磁盘也能恢复数据;

MinIO基本概念:

  • bucket(桶) :类似文件系统的目录(文件夹);
  • Object : 类似文件系统的文件;
  • Keys :类似文件名;
  • MINIO_ACCESS_KEY:访问key,类似账号;
  • MINIO_SECRET_KEY:秘钥,类似密码。
二. Dokcer安装Minio
2.1 创建文件夹

在home/docker/minio文件夹下创建两个文件夹,分别是data、config,用于挂载容器中的数据卷。

  1. mkdir home/docker/minio/data
  2. mkdir home/docker/minio/config
2.1 拉取镜像
docker pull minio/minio
2.3 启动容器
  1. docker run -p 9000:9000 -p 9001:9001\
  2. --name minio \
  3. -d --restart=always \
  4. -e "MINIO_ROOT_USER=minio" \
  5. -e "MINIO_ROOT_PASSWORD=minio123" \
  6. -v /home/docker/minio/data:/data \
  7. -v /home/docker/minio/config \
  8. minio/minio server \
  9. /data --console-address ":9001" -address ":9000"

参数说明

  • -p:MinIO 服务会暴露 9000 端口作为API端口,9001 端口为可视化管理页面端口
  • -v :挂载数据卷,将 minio 容器内存储的数据、配置文件映射到宿主机
  • -e MINIO_ROOT_USER:设置 root 用户名
  • -e MINIO_ROOT_PASSWORD:设置 root 的密码,长度至少 8 位
  • --console-address:指定可视化界面端口
  • -address:指定服务端口

记得开放安全组!

2.4 查看日志
docker logs minio容器id

通过以上命令查看 minio 日志,会输出以下内容:

我们可以通过日志中的Console地址来访问可视化界面。

三.访问Minio

登录成功后,可以创建桶

 此时在桶列表会会出现刚刚创建的桶,点击Manage,设置桶的访问策略,修改为 Public 公共策略,这样 minio 中的文件才能被外界访问

 并可以直接在桶中上传文件。

四. 整合Springboot完成文件上传
4.1创建springboot工程
4.2 导入相关依赖
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter</artifactId>
  5. </dependency>
  6. <!-- 必须要导入OKhttp的依赖 -->
  7. <dependency>
  8. <groupId>com.squareup.okhttp3</groupId>
  9. <artifactId>okhttp</artifactId>
  10. <version>4.8.1</version>
  11. </dependency>
  12. <!-- https://mvnrepository.com/artifact/io.minio/minio -->
  13. <dependency>
  14. <groupId>io.minio</groupId>
  15. <artifactId>minio</artifactId>
  16. <version>8.5.7</version>
  17. </dependency>
  18. <!--web-->
  19. <dependency>
  20. <groupId>org.springframework.boot</groupId>
  21. <artifactId>spring-boot-starter-web</artifactId>
  22. </dependency>
  23. <!--lombok-->
  24. <dependency>
  25. <groupId>org.projectlombok</groupId>
  26. <artifactId>lombok</artifactId>
  27. </dependency>
  28. </dependencies>
4.3 yaml中配置 Minio

在 yaml 中新增以下配置:

  1. minio:
  2. accessKey: minio # 访问Key
  3. secretKey: minio123 # 密钥
  4. bucket: test
  5. endpoint: http://xxx.x.x.x:9000 # ip:api端口
  6. readPath: http://xxx.x.x.x:9000 # ip:api端口
  7. servlet:
  8. multipart:
  9. # 单个上传文件的最大值是200mb
  10. max-file-size: 200MB
  11. # 单次请求的最大值
  12. max-request-size: 200MB
4.4 编写 MinIO属性配置类
  1. @Data
  2. @Component
  3. @ConfigurationProperties(prefix = "minio") //自动注入属性前缀为minio的配置
  4. public class MinIOConfigProperties implements Serializable {
  5. private String accessKey; // 访问key
  6. private String secretKey; // 秘钥
  7. private String bucket; // 桶
  8. private String endpoint; // 地域节点
  9. private String readPath; // 读取路径
  10. }
4.5 编写MinIO配置类,注册MinioClient客户端Bean实例
  1. @Configuration
  2. public class MinIOConfig {
  3. @Autowired
  4. private MinIOConfigProperties minIOConfigProperties;
  5. // 注册MinIO实例
  6. @Bean
  7. public MinioClient buildMinioClient(){
  8. return MinioClient
  9. .builder()
  10. .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())
  11. .endpoint(minIOConfigProperties.getEndpoint())
  12. .build();
  13. }
  14. }
4.6 编写操作minio相关业务接口
  1. public interface FileStorageService {
  2. /**
  3. * 上传图片文件
  4. *
  5. * @param prefix 文件前缀
  6. * @param filename 文件名
  7. * @param inputStream 文件流
  8. * @return 文件全路径
  9. */
  10. public String uploadImgFile(String prefix, String filename, InputStream inputStream);
  11. /**
  12. * 上传html文件
  13. *
  14. * @param prefix 文件前缀
  15. * @param filename 文件名
  16. * @param inputStream 文件流
  17. * @return 文件全路径
  18. */
  19. public String uploadHtmlFile(String prefix, String filename, InputStream inputStream);
  20. /**
  21. * 删除文件
  22. *
  23. * @param pathUrl 文件全路径
  24. */
  25. public void delete(String pathUrl);
  26. /**
  27. * 下载文件
  28. *
  29. * @param pathUrl 文件全路径
  30. * @return
  31. */
  32. public byte[] downLoadFile(String pathUrl);
  33. }

业务接口实现类:

  1. @Service
  2. public class MinIOFileStorageService implements FileStorageService {
  3. @Autowired
  4. MinioClient minioClient;
  5. @Autowired
  6. MinIOConfigProperties minIOConfigProperties;
  7. final static String separator = "/"; //文件夹分隔符
  8. /**
  9. * 构建文件的绝对路径
  10. *
  11. * @param dirPath 文件路径
  12. * @param filename 文件名 yyyy/mm/dd/file.jpg
  13. * @return /test
  14. */
  15. public String builderFilePath(String dirPath, String filename) {
  16. StringBuilder stringBuilder = new StringBuilder(50);
  17. if (!StringUtils.isEmpty(dirPath)) {
  18. stringBuilder.append(dirPath).append(separator);
  19. }
  20. SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  21. String todayStr = sdf.format(new Date());
  22. stringBuilder.append(todayStr).append(separator);
  23. stringBuilder.append(filename);
  24. return stringBuilder.toString();
  25. }
  26. /**
  27. * 上传图片文件
  28. *
  29. * @param prefix 文件前缀
  30. * @param filename 文件名
  31. * @param inputStream 文件流
  32. * @return 文件全路径
  33. */
  34. @Override
  35. public String uploadImgFile(String prefix, String filename, InputStream inputStream) {
  36. String filePath = builderFilePath(prefix, filename);
  37. try {
  38. PutObjectArgs putObjectArgs = PutObjectArgs.builder()
  39. .object(filePath)
  40. .contentType("image/jpg")
  41. .bucket(minIOConfigProperties.getBucket()).stream(inputStream, inputStream.available(), -1)
  42. .build();
  43. minioClient.putObject(putObjectArgs);
  44. StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
  45. urlPath.append(separator + minIOConfigProperties.getBucket());
  46. urlPath.append(separator);
  47. urlPath.append(filePath);
  48. return urlPath.toString();
  49. } catch (Exception ex) {
  50. throw new RuntimeException("上传文件失败");
  51. }
  52. }
  53. /**
  54. * 上传html文件
  55. *
  56. * @param prefix 文件前缀
  57. * @param filename 文件名
  58. * @param inputStream 文件流
  59. * @return 文件全路径
  60. */
  61. @Override
  62. public String uploadHtmlFile(String prefix, String filename, InputStream inputStream) {
  63. String filePath = builderFilePath(prefix, filename);
  64. try {
  65. PutObjectArgs putObjectArgs = PutObjectArgs.builder()
  66. .object(filePath) //文件名
  67. .contentType("text/html")//文件类型
  68. .bucket(minIOConfigProperties.getBucket())//桶名称与minio创建的桶一致
  69. .stream(inputStream, inputStream.available(), -1)//文件流
  70. .build();
  71. minioClient.putObject(putObjectArgs);
  72. StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
  73. urlPath.append(separator + minIOConfigProperties.getBucket());
  74. urlPath.append(separator);
  75. urlPath.append(filePath);
  76. return urlPath.toString(); //文件全路径
  77. } catch (Exception ex) {
  78. ex.printStackTrace();
  79. throw new RuntimeException("上传文件失败");
  80. }
  81. }
  82. /**
  83. * 删除文件
  84. *
  85. * @param pathUrl 文件全路径
  86. */
  87. @Override
  88. public void delete(String pathUrl) {
  89. String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
  90. int index = key.indexOf(separator);
  91. String bucket = key.substring(0, index);
  92. String filePath = key.substring(index + 1);
  93. // 删除Objects
  94. RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();
  95. try {
  96. minioClient.removeObject(removeObjectArgs);
  97. } catch (Exception e) {
  98. e.printStackTrace();
  99. }
  100. }
  101. /**
  102. * 下载文件
  103. *
  104. * @param pathUrl 文件全路径
  105. * @return 文件流
  106. */
  107. @Override
  108. public byte[] downLoadFile(String pathUrl) {
  109. String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
  110. int index = key.indexOf(separator);
  111. String bucket = key.substring(0, index);
  112. String filePath = key.substring(index + 1);
  113. InputStream inputStream = null;
  114. try {
  115. inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
  116. } catch (Exception e) {
  117. e.printStackTrace();
  118. }
  119. //字节数组输出流
  120. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  121. byte[] buff = new byte[100];
  122. int rc = 0;
  123. while (true) {
  124. try {
  125. if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;
  126. } catch (IOException e) {
  127. e.printStackTrace();
  128. }
  129. byteArrayOutputStream.write(buff, 0, rc);
  130. }
  131. return byteArrayOutputStream.toByteArray();
  132. }
  133. }
4.7 编写controller进行测试
  1. @RestController
  2. @RequestMapping("/minio")
  3. public class MinioController {
  4. @Autowired
  5. private FileStorageService fileStorageService;
  6. /**
  7. * 上传图片到minio
  8. *
  9. * @param file
  10. * @return
  11. */
  12. @PostMapping("/upload")
  13. public void uploadFile(MultipartFile file) throws IOException {
  14. try {
  15. // 获取文件名称
  16. String fileName = file.getOriginalFilename();
  17. /*解决多次上传同名文件覆盖问题*/
  18. // 在文件名称里面添加随机唯一的值
  19. String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  20. fileName = uuid + fileName;
  21. // 获取文件输入流
  22. InputStream is = file.getInputStream();
  23. String imgUrl = fileStorageService.uploadImgFile("img", fileName, is);
  24. return "上传成功!imgUrl:"+imgUrl;
  25. } catch (IOException e) {
  26. e.printStackTrace();
  27. return "上传失败";
  28. }
  29. }
  30. }
4.8 启动项目,测试

查看 Minio 可视化界面图片是否上传成功

可通过ip+图片路径直接访问。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/713199
推荐阅读
相关标签
  

闽ICP备14008679号