初步搭建一个本身的对象存储服务---Minio

打印 上一主题 下一主题

主题 841|帖子 841|积分 2523

docker安装

1、拉取镜像
docker pull minio/minio
2、启动镜像
  1. docker run -p 9000:9000 -p 9001:9001 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123456" -v /home/data:/data -v /home/config:/root/.minio minio/minio server --console-address ":9000" --address ":9001" /data
复制代码
重要:

  • -p9000 是图形界面的端口,9001 是 API 的端口,在使用 SDK 毗连需要用到
  • MINIO_ACCESS_KEY:指定图形界面的用户名
  • MINIO_SECRET_KEY:指定图形界面的暗码
命令参数及选项说明:

  • docker run: 这是 Docker 的根本命令,用于运行一个新的容器。
  • -p 9000:9000 -p 9001:9001: 使用 -p 或 --publish 选项将主机(宿主机)端口映射到容器内部端口。这里分别做了两个端口映射:

    • 9000:9000:将主机的 9000 端口与容器内的 9000 端口绑定,使得外部可以通过主机的 9000 端口访问到容器内运行的服务。
    • 9001:9001:同样地,将主机的 9001 端口与容器内的 9001 端口绑定。

  • --name minio: 使用 --name 选项指定新创建容器的名称为 minio,便于后续管理和引用。
  • -d: 使用 -d 或 --detach 标记使容器在背景以守护进程模式运行,即启动后立刻返回控制台而不阻塞。
  • --restart=always: 设置容器的重启策略为 always,这意味着假如容器意外克制(如由于体系重启或故障),Docker 将自动重新启动该容器。
  • -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin": 使用 -e 或 --env 选项设置情况变量。这里设置了 MinIO 需要的访问密钥和秘密密钥:

    • MINIO_ACCESS_KEY=admin:定义 MinIO 的访问密钥(Access Key),用于身份验证。
    • MINIO_SECRET_KEY=admin:定义 MinIO 的秘密密钥(Secret Key),与访问密钥一起构成认证凭据。

  • -v /home/data:/data -v /home/config:/root/.minio: 使用 -v 或 --volume 选项挂载主机目录到容器内:

    • -v /home/data:/data:将主机上的 /home/data 目录挂载到容器内的 /data 目录,用于存放 MinIO 存储的数据。
    • -v /home/config:/root/.minio:将主机上的 /home/config 目录挂载到容器内的 /root/.minio 目录,通常用于保存 MinIO 的配置文件和其他持久化数据。

  • minio/minio: 指定要使用的 Docker 镜像,这里是官方的 minio/minio 镜像。
  • server: 运行 MinIO 容器时实行的命令,通常为 server,用于启动 MinIO 服务。
  • --console-address ":9000" --address ":9001": 通报给 server 命令的 MinIO 特定参数:


  • --console-address ":9000":指定 MinIO 管理控制台的监听地址为 :9000,即容器内的所有网络接口都会监听此端口。由于已经做了端口映射,外部可以通过主机的 9000 端口访问控制台。
  • --address ":9001":指定 MinIO 服务 API 的监听地址为 :9001,同样对所有网络接口开放。外部可通过主机的 9001 端口与 MinIO API 举行交互。

  • /data: 最后的 /data 参数指定了 MinIO 服务的数据目录,纵然用挂载的 /data 目录作为存储桶数据的现实位置。
访问

浏览器输入http://ip:9000/login
图形界面

1、创建桶

2、设置权限

3、获取accessKey  和 secretKey

注意:创建__accessKey  和 secretKey的时候,要注意保存好。
Java毗连Minio(SDK)

1、添加依赖
  1. <dependency>
  2.   <groupId>io.minio</groupId>
  3.   <artifactId>minio</artifactId>
  4.   <version>8.2.1</version>
  5. </dependency>
复制代码
2、demo
  1. import io.minio.BucketExistsArgs;
  2. import io.minio.MakeBucketArgs;
  3. import io.minio.MinioClient;
  4. import io.minio.UploadObjectArgs;
  5. import io.minio.errors.MinioException;
  6. import java.io.IOException;
  7. import java.security.InvalidKeyException;
  8. import java.security.NoSuchAlgorithmException;
  9. public class FileUploader {
  10.     // minio的api 端口(不是图形界面)
  11.     public static String endPoint = "http://xxx.xxx.xxx.xxx:9001/";
  12.    
  13.     public static String accessKey = "YLCS8UYJFX02E70OV7MK";
  14.     public static String secretKey = "不能外露";
  15.     public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
  16.         try {
  17.             // 创建minioClient, 使用上面的endpoint,ak,sk
  18.             MinioClient minioClient =
  19.             MinioClient.builder()
  20.             .endpoint(endPoint)
  21.             .credentials(accessKey, secretKey)
  22.             .build();
  23.             // 如果指定的bucket不存在,则创建,否则使用已有bucket
  24.             // 指定bucket名称
  25.             String bucketName = "test";
  26.             boolean found =
  27.             minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
  28.             if (!found) {
  29.                 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  30.             } else {
  31.                 System.out.println("Bucket '" + bucketName + "' already exists.");
  32.             }
  33.             // 文件来自哪里
  34.             String filePath = "C:\\Users\\DELL\\Pictures\\Saved Pictures\\2.jpg";
  35.             // 存储后的文件名
  36.             String fileName = "minio_test_text.png";
  37.             // 执行文件上传
  38.             minioClient.uploadObject(
  39.                 UploadObjectArgs.builder()
  40.                 .bucket(bucketName)
  41.                 .object(fileName)
  42.                 .filename(filePath)
  43.                 .build());
  44.             System.out.println("'" + filePath + "' 成功上传对象 '" + fileName + "' 到 bucket '" + bucketName + "'.");
  45.         } catch (MinioException e) {
  46.             System.out.println("Error occurred: " + e);
  47.             System.out.println("HTTP trace: " + e.httpTrace());
  48.         }
  49.     }
  50. }
复制代码
封装工具类

1、配置文件
  1.   chuangyue:
  2.     minio:
  3.       # 访问的url
  4.       endpoint: http://xxx.xxx.xxx.xxx
  5.       # API的端口
  6.       port: 9001
  7.       # 秘钥
  8.       accessKey: YLCS8UYJFX02E70OV7MK
  9.       secretKey: 不能看
  10.       secure: false
  11.       bucket-name: test # 桶名 我这是给出了一个默认桶名
  12.       image-size: 10485760 # 我在这里设定了 图片文件的最大大小
  13.       file-size: 1073741824 # 此处是设定了文件的最大大小
复制代码
2、属性配置类
  1. @Component
  2. @ConfigurationProperties(prefix = "chuangyue.minio")
  3. @Data
  4. public class MinioProperties {
  5.     // 访问的 api 的url
  6.     private String endpoint;
  7.     // api端口号
  8.     private String port;
  9.     // 密钥
  10.     private String accessKey;
  11.     private String secretKey;
  12.     private Boolean secure;
  13.     // 桶名
  14.     private String bucketName;
  15.     // 图片文件的最大大小
  16.     private long imageSize;
  17.     // 文件的最大大小
  18.     private long fileSize;
  19. }
复制代码
3、工具类
  1. package com.zyp.utils;
  2. import io.minio.*;
  3. import io.minio.errors.MinioException;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import java.io.IOException;
  8. import java.security.InvalidKeyException;
  9. import java.security.NoSuchAlgorithmException;
  10. import java.util.UUID;
  11. @Component
  12. @Slf4j
  13. public class MinioUtil {
  14.    
  15.     /**
  16.      * @ description 上传
  17.      * @param file 文件
  18.      * @param endPoint 访问的地址
  19.      * @param port 端口号
  20.      * @param accessKey 密钥
  21.      * @param secretKey 密钥
  22.      * @param bucketName 桶名称
  23.      * @ return java.lang.String
  24.      * @ author DELL
  25.      */
  26.     public static String upload(MultipartFile file, String endPoint, String port, String accessKey, String secretKey, String bucketName) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
  27.         try {
  28.             // 创建minioClient
  29.             MinioClient minioClient =
  30.                     MinioClient.builder()
  31.                             .endpoint(endPoint + ":" + port)
  32.                             .credentials(accessKey, secretKey)
  33.                             .build();
  34.             // 如果指定的bucket不存在,则创建,否则使用已有bucket
  35.             boolean found =
  36.                     minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
  37.             if (!found) {
  38.                 minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
  39.             } else {
  40.                 log.info("Bucket {} already exists", bucketName);
  41.             }
  42.             // 获取文件原始名称
  43.             String oringinalName = file.getOriginalFilename();
  44.             // 获取后缀
  45.             String suffix = oringinalName.substring(oringinalName.lastIndexOf('.'));
  46.             // 拼接存储后的文件名
  47.             String fileName = UUID.randomUUID().toString() + suffix;
  48.             PutObjectArgs putObjectArgs = PutObjectArgs.builder()
  49.                     .bucket(bucketName)
  50.                     .object(fileName)
  51.                     .stream(file.getInputStream(), file.getSize(), -1)
  52.                     .contentType(file.getContentType())
  53.                     .build();
  54.             minioClient.putObject(putObjectArgs);
  55.             log.info("文件上传成功");
  56.             // 拼接url并返回
  57.             return endPoint + ":" + port + "/" + bucketName + "/" + fileName;
  58.         } catch (MinioException e) {
  59.             System.out.println("Error occurred: " + e);
  60.             System.out.println("HTTP trace: " + e.httpTrace());
  61.             return "error";
  62.         }
  63.     }
  64. }
复制代码
4、使用,定义一个文件上传的接口
  1. @RestController
  2. @Slf4j
  3. public class FileUploadController {
  4.     @Autowired
  5.     private MinioProperties minioProperties;
  6.     /**
  7.      * @ description 文件上传
  8.      * @param file
  9.      * @ return com.zyp.pojo.Result<java.lang.String>
  10.      * @ author DELL
  11.      */
  12.     @PostMapping("/upload")
  13.     public Result<String> upload(MultipartFile file) throws Exception {
  14.         String url = MinioUtil.upload(file, minioProperties.getEndpoint(), minioProperties.getPort(), minioProperties.getAccessKey(), minioProperties.getSecretKey(), minioProperties.getBucketName());
  15.         log.info("url= {}",url);
  16.         if(url.isEmpty() || url.equals("error")){
  17.             throw new UploadErrorException("文件上传失败");
  18.         }else{
  19.             return Result.success(url);
  20.         }
  21.     }
  22. }
复制代码
常见问题

1、tomcat限制了文件上传或者下载的大小
解决:修改配置文件
  1. spring:
  2.   servlet:
  3.     multipart:
  4.       max-file-size: 50MB
  5.       max-request-size: 50MB
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表