当前位置:   article > 正文

MinIO的使用_minio使用教程

minio使用教程

一. window环境安装

1. 安装包下载地址:https://min.io/download#/windows,下载一个可执行文件  minio.exe
2. 在想安装目录新建一个minio文件夹,并把minio.exe文件放入minio文件夹中,并且在该文件夹新建一个data文件夹
3. 进入minio文件夹,在路径输入cmd,输入执行 minio.exe server data 命令
4. 若需要换端口则需要执行 minio.exe server data --console-address ":9100" --address ":9101" 注意代码上配置文件需要设置成9101
5. 浏览器输入域地址:http://ip:9101 账号 minioadmin 密码:minioadmin

2.linux环境安装

1. 使用docker安装minio
2. 下载镜像 docker pull minio/minio 
3. 查看镜像 docker images
4. 创建目录,一个用来存放配置,一个用来存储上传文件的目录,启动前需要先创建Minio外部挂载的配置文件( /usr/local/minio/config),和存储上传文件的目录( /usr/local/minio/data)
5. 创建容器并运行,下面运行指令

  1. docker run \
  2. -p 19000:9000 \
  3. -p 9090:9090 \
  4. --net=host \
  5. --name minio \
  6. -d --restart=always \
  7. -e "MINIO_ACCESS_KEY=minioadmin" \
  8. -e "MINIO_SECRET_KEY=minioadmin" \
  9. -v /usr/local/minio/data:/data \
  10. -v /usr/local/minio/config:/root/.minio \
  11. minio/minio server \
  12. /data --console-address ":9090" -address ":19000
命令描述
-p 19000:9000 -p 9090:9090这是端口映射,前一个是服务器的端口,后一个是客户端也就是api接口访问的端口地址
–name minio这是给新创建的容器命名的选项,名字是 “minio”
–net=host这是网络设置,表示容器将使用主机的网络栈,这样就不需要在容器内部配置网络
-d --restart=always这是运行容器的其他选项,-d使容器在后台运行,–restart=always表示容器总是会在退出后自动重启
-e “MINIO_ACCESS_KEY=minioadmin”用户名
-e “MINIO_SECRET_KEY=minioadmin”密码
-v /usr/local/minio/data:/data这意味着将宿主机上的/usr/local/minio/data 目录挂载到容器内的 /data 目录
-v /usr/local/minio/config:/root/.minio将宿主机上的 /usr/local/minio/config 目录挂载到容器内的 /root/.minio 目录
minio/minio server <br/>/data --console-address ":9090" -address ":19000这是容器内要运行的命令,启动一个名为 “minio” 的服务器,数据存储在 /data 目录下,服务器的控制台地址为 “:9090”,服务地址为 “:19000”
\换行


6.访问操作
http://ip:9090/login  账号:minioadmin 密码:minioadmin

3.MinIO的介绍使用

3.1 MinIO概述

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

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

3.2 MinIO特点

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

3.3 MinIO基本概念

  1. bucket(桶) :类似文件系统的目录(文件夹);
  2. Object : 类似文件系统的文件;
  3. Keys :类似文件名;
  4. MINIO_ACCESS_KEY:访问key,类似账号;
  5. MINIO_SECRET_KEY:秘钥,类似密码。

4. springboot整合MinIO

4.1 项目准备

4.1.1 配置 ACCESS KEYS 获取

4.1.2 新建桶,用来存放文件的位置

4.1.3.点击新建的桶,里面配置公众类型,避免文件地址访问不了

4.2 配置文件设置

4.2.1 导入依赖
  1. <!-- https://mvnrepository.com/artifact/io.minio/minio -->
  2. <dependency>
  3. <groupId>io.minio</groupId>
  4. <artifactId>minio</artifactId>
  5. <version>8.2.1</version>
  6. </dependency>
4.2.2 配置yml文件
  1. minio:
  2. #accessKey: FPi1mrIRT7LdkVrVgKyq
  3. #secretKey: f0CLUsOPon8qxMFUmCqicHJFkueyWJzyk4CifsEE
  4. #accessKey ,secretKey值的获取在配置accessKey步骤体现
  5. accessKey: FjFA028O825BZ47II9fT
  6. secretKey: 5AumALef8wccA1caMamfD3U0DxLAQTK4Z54jQd3y
  7. # 存放文件的桶
  8. bucket: test
  9. # 访问路径
  10. endpoint: http://110.42.139.83:19000
  11. readPath: http://110.42.139.83:19000
  12. servlet:
  13. multipart:
  14. max-file-size: 200MB
  15. max-request-size: 200MB

4.3 工具类

  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. }
  1. @Component
  2. @Slf4j
  3. public class MinioFileHelper {
  4. @Autowired
  5. MinioClient minioClient;
  6. @Autowired
  7. MinIOConfigProperties minIOConfigProperties;
  8. final static String separator = "/"; //文件夹分隔符
  9. /**
  10. * 上传文件
  11. *
  12. * @param prefix 文件前缀
  13. * @param filename 文件名
  14. * @param inputStream 文件流
  15. * @return 文件全路径
  16. */
  17. public String uploadFile(String prefix, String filename, InputStream inputStream) {
  18. String filePath = builderFilePath(prefix, filename);
  19. try {
  20. PutObjectArgs putObjectArgs = PutObjectArgs.builder()
  21. .object(filePath)
  22. .bucket(minIOConfigProperties.getBucket()).stream(inputStream, inputStream.available(), -1)
  23. .build();
  24. minioClient.putObject(putObjectArgs);
  25. StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
  26. urlPath.append(separator + minIOConfigProperties.getBucket());
  27. urlPath.append(separator);
  28. urlPath.append(filePath);
  29. return urlPath.toString();
  30. } catch (Exception ex) {
  31. throw new RuntimeException("上传文件失败");
  32. }
  33. }
  34. /**
  35. * minio上传图片
  36. */
  37. public String uploadPicture(String prefix, String filename, InputStream inputStream) {
  38. String filePath = builderFilePath(prefix, filename);
  39. try {
  40. PutObjectArgs putObjectArgs = PutObjectArgs.builder()
  41. .object(filePath)
  42. .contentType("image/jpg")
  43. .bucket(minIOConfigProperties.getBucket()).stream(inputStream, inputStream.available(), -1)
  44. .build();
  45. minioClient.putObject(putObjectArgs);
  46. StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
  47. urlPath.append(separator + minIOConfigProperties.getBucket());
  48. urlPath.append(separator);
  49. urlPath.append(filePath);
  50. return urlPath.toString();
  51. } catch (Exception ex) {
  52. throw new RuntimeException("上传文件失败");
  53. }
  54. }
  55. /**
  56. * 上传html文件
  57. *
  58. * @param prefix 文件前缀
  59. * @param filename 文件名
  60. * @param inputStream 文件流
  61. * @return 文件全路径
  62. */
  63. public String uploadHtmlFile(String prefix, String filename, InputStream inputStream) {
  64. String filePath = builderFilePath(prefix, filename);
  65. try {
  66. PutObjectArgs putObjectArgs = PutObjectArgs.builder()
  67. .object(filePath) //文件名
  68. .contentType("text/html")//文件类型
  69. .bucket(minIOConfigProperties.getBucket())//桶名称与minio创建的桶一致
  70. .stream(inputStream, inputStream.available(), -1)//文件流
  71. .build();
  72. minioClient.putObject(putObjectArgs);
  73. StringBuilder urlPath = new StringBuilder(minIOConfigProperties.getReadPath());
  74. urlPath.append(separator + minIOConfigProperties.getBucket());
  75. urlPath.append(separator);
  76. urlPath.append(filePath);
  77. return urlPath.toString(); //文件全路径
  78. } catch (Exception ex) {
  79. ex.printStackTrace();
  80. throw new RuntimeException("上传文件失败");
  81. }
  82. }
  83. /**
  84. * 删除文件
  85. *
  86. * @param pathUrl 文件全路径
  87. */
  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. public byte[] downLoadFile(String pathUrl) {
  108. String key = pathUrl.replace(minIOConfigProperties.getEndpoint() + "/", "");
  109. int index = key.indexOf(separator);
  110. String bucket = key.substring(0, index);
  111. String filePath = key.substring(index + 1);
  112. InputStream inputStream = null;
  113. try {
  114. inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());
  115. } catch (Exception e) {
  116. e.printStackTrace();
  117. }
  118. //字节数组输出流
  119. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  120. byte[] buff = new byte[100];
  121. int rc = 0;
  122. while (true) {
  123. try {
  124. if (!((rc = inputStream.read(buff, 0, 100)) > 0)) break;
  125. } catch (IOException e) {
  126. e.printStackTrace();
  127. }
  128. byteArrayOutputStream.write(buff, 0, rc);
  129. }
  130. return byteArrayOutputStream.toByteArray();
  131. }
  132. /**
  133. * 构建文件的绝对路径
  134. */
  135. public String builderFilePath(String dirPath, String filename) {
  136. StringBuilder stringBuilder = new StringBuilder(50);
  137. if (!StringUtils.isEmpty(dirPath)) {
  138. stringBuilder.append(dirPath).append(separator);
  139. }
  140. // SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 若使用的是/则访问路径yyyy/MM/dd/文件名
  141. SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  142. String todayStr = sdf.format(new Date());
  143. stringBuilder.append(todayStr).append(separator);
  144. stringBuilder.append(filename);
  145. return stringBuilder.toString();
  146. }

4.4 调用

  1. @RestController
  2. @Api(tags = "Minio文件上传")
  3. @Slf4j
  4. public class MinioController implements InterfaceRouteUtils {
  5. @Autowired
  6. private MinioFileService minioFileService;
  7. @PostMapping(MINIO_PICTURE_UPLOAD)
  8. @ApiOperation(value = "文件上传-图片", notes = "文件上传")
  9. public ResponseEntity<String> uploadPicture(MultipartFile file) {
  10. try {
  11. return new ResponseEntity<>(minioFileService.uploadPicture(file));
  12. } catch (BaseDocumentException e) {
  13. return new ResponseEntity<>(e.getCode(), e.getMessage());
  14. }
  15. }
  16. @PostMapping(MINIO_FILE_UPLOAD)
  17. @ApiOperation(value = "文件上传", notes = "文件上传")
  18. public ResponseEntity<String> updateFile(MultipartFile file) {
  19. try {
  20. return new ResponseEntity<>(minioFileService.uploadFile(file));
  21. } catch (BaseDocumentException e) {
  22. return new ResponseEntity<>(e.getCode(), e.getMessage());
  23. }
  24. }
  25. }
  1. public interface MinioFileService {
  2. /**
  3. * minio 文件上传文件
  4. */
  5. String uploadFile(MultipartFile file) throws BaseDocumentException;
  6. /**
  7. * minio 文件上传图片
  8. */
  9. String uploadPicture(MultipartFile file) throws BaseDocumentException;
  10. }
  1. @Service
  2. @Slf4j
  3. public class MinioFileServiceImpl implements MinioFileService {
  4. @Autowired
  5. private MinioFileHelper minioFileHelper;
  6. /**
  7. * minio 文件上传
  8. */
  9. @Override
  10. public String uploadFile(MultipartFile file) throws BaseDocumentException {
  11. try {
  12. // 获取文件名称
  13. String fileName = file.getOriginalFilename();
  14. String extension = "";
  15. int i = fileName.lastIndexOf('.');
  16. if (i > 0) {
  17. extension = fileName.substring(i+1);
  18. }
  19. String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  20. fileName = uuid+"."+extension;
  21. InputStream is = file.getInputStream();
  22. String imgUrl = minioFileHelper.uploadFile("file", fileName, is);
  23. return imgUrl;
  24. }catch (Exception e){
  25. log.error("",e);
  26. throw new BaseDocumentException(ErrorCode.OPERATION_ERR);
  27. }
  28. }
  29. @Override
  30. public String uploadPicture(MultipartFile file) throws BaseDocumentException {
  31. try {
  32. // 获取文件名称
  33. String fileName = file.getOriginalFilename();
  34. String extension = "";
  35. int i = fileName.lastIndexOf('.');
  36. if (i > 0) {
  37. extension = fileName.substring(i+1);
  38. }
  39. String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  40. fileName = uuid+"."+extension;
  41. InputStream is = file.getInputStream();
  42. String imgUrl = minioFileHelper.uploadPicture("img", fileName, is);
  43. return imgUrl;
  44. }catch (Exception e){
  45. log.error("",e);
  46. throw new BaseDocumentException(ErrorCode.OPERATION_ERR);
  47. }
  48. }
  49. }

4.5 运行结果

接口返回路径,若是文件则直接下载,如果是图片则直接访问

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

闽ICP备14008679号