• 初步搭建一个自己的对象存储服务---Minio


    docker安装

    1、拉取镜像
    docker pull minio/minio
    2、启动镜像

    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:指定图形界面的密码

    命令参数及选项说明:

    1. docker run: 这是 Docker 的基本命令,用于运行一个新的容器。
    2. -p 9000:9000 -p 9001:9001: 使用 -p 或 --publish 选项将主机(宿主机)端口映射到容器内部端口。这里分别做了两个端口映射:
      • 9000:9000:将主机的 9000 端口与容器内的 9000 端口绑定,使得外部可以通过主机的 9000 端口访问到容器内运行的服务。
      • 9001:9001:同样地,将主机的 9001 端口与容器内的 9001 端口绑定。
    3. --name minio: 使用 --name 选项指定新创建容器的名称为 minio,便于后续管理和引用。
    4. -d: 使用 -d 或 --detach 标志使容器在后台以守护进程模式运行,即启动后立即返回控制台而不阻塞。
    5. --restart=always: 设置容器的重启策略为 always,这意味着如果容器意外停止(如由于系统重启或故障),Docker 将自动重新启动该容器。
    6. -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),与访问密钥一起构成认证凭据。
    7. -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 的配置文件和其他持久化数据。
    8. minio/minio: 指定要使用的 Docker 镜像,这里是官方的 minio/minio 镜像。
    9. server: 运行 MinIO 容器时执行的命令,通常为 server,用于启动 MinIO 服务。
    10. --console-address ":9000" --address ":9001": 传递给 server 命令的 MinIO 特定参数:
    • --console-address ":9000":指定 MinIO 管理控制台的监听地址为 :9000,即容器内的所有网络接口都会监听此端口。由于已经做了端口映射,外部可以通过主机的 9000 端口访问控制台。
    • --address ":9001":指定 MinIO 服务 API 的监听地址为 :9001,同样对所有网络接口开放。外部可通过主机的 9001 端口与 MinIO API 进行交互。
    1. /data: 最后的 /data 参数指定了 MinIO 服务的数据目录,即使用挂载的 /data 目录作为存储桶数据的实际位置。

    访问

    浏览器输入http://ip:9000/login

    图形界面

    1、创建桶
    image.png

    2、设置权限
    image.png

    3、获取accessKey 和 secretKey
    image.png

    注意:创建__accessKey 和 secretKey的时候,要注意保存好。

    Java连接Minio(SDK)

    1、添加依赖

    <dependency>
      <groupId>io.miniogroupId>
      <artifactId>minioartifactId>
      <version>8.2.1version>
    dependency>
    

    2、demo

    import io.minio.BucketExistsArgs;
    import io.minio.MakeBucketArgs;
    import io.minio.MinioClient;
    import io.minio.UploadObjectArgs;
    import io.minio.errors.MinioException;
    
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    
    public class FileUploader {
        // minio的api 端口(不是图形界面)
        public static String endPoint = "http://xxx.xxx.xxx.xxx:9001/";
        
        public static String accessKey = "YLCS8UYJFX02E70OV7MK";
        public static String secretKey = "不能外露";
    
        public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
            try {
                // 创建minioClient, 使用上面的endpoint,ak,sk
                MinioClient minioClient =
                MinioClient.builder()
                .endpoint(endPoint)
                .credentials(accessKey, secretKey)
                .build();
    
                // 如果指定的bucket不存在,则创建,否则使用已有bucket
                // 指定bucket名称
                String bucketName = "test";
                boolean found =
                minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
                if (!found) {
                    minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
                } else {
                    System.out.println("Bucket '" + bucketName + "' already exists.");
                }
    
                // 文件来自哪里
                String filePath = "C:\\Users\\DELL\\Pictures\\Saved Pictures\\2.jpg";
                // 存储后的文件名
                String fileName = "minio_test_text.png";
    
                // 执行文件上传
                minioClient.uploadObject(
                    UploadObjectArgs.builder()
                    .bucket(bucketName)
                    .object(fileName)
                    .filename(filePath)
                    .build());
                System.out.println("'" + filePath + "' 成功上传对象 '" + fileName + "' 到 bucket '" + bucketName + "'.");
            } catch (MinioException e) {
                System.out.println("Error occurred: " + e);
                System.out.println("HTTP trace: " + e.httpTrace());
            }
        }
    }
    
    

    封装工具类

    1、配置文件

      chuangyue:
        minio:
          # 访问的url
          endpoint: http://xxx.xxx.xxx.xxx
          # API的端口
          port: 9001
          # 秘钥
          accessKey: YLCS8UYJFX02E70OV7MK
          secretKey: 不能看
          secure: false
          bucket-name: test # 桶名 我这是给出了一个默认桶名
          image-size: 10485760 # 我在这里设定了 图片文件的最大大小
          file-size: 1073741824 # 此处是设定了文件的最大大小
    

    2、属性配置类

    @Component
    @ConfigurationProperties(prefix = "chuangyue.minio")
    @Data
    public class MinioProperties {
        // 访问的 api 的url
        private String endpoint;
        // api端口号
        private String port;
        // 密钥
        private String accessKey;
        private String secretKey;
        private Boolean secure;
        // 桶名
        private String bucketName;
        // 图片文件的最大大小
        private long imageSize;
        // 文件的最大大小
        private long fileSize;
    }
    
    

    3、工具类

    package com.zyp.utils;
    
    import io.minio.*;
    import io.minio.errors.MinioException;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;
    
    import java.io.IOException;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.util.UUID;
    
    @Component
    @Slf4j
    public class MinioUtil {
        
        /**
         * @ description 上传
         * @param file 文件
         * @param endPoint 访问的地址
         * @param port 端口号
         * @param accessKey 密钥
         * @param secretKey 密钥
         * @param bucketName 桶名称
         * @ return java.lang.String
         * @ author DELL
         */
        public static String upload(MultipartFile file, String endPoint, String port, String accessKey, String secretKey, String bucketName) throws IOException, NoSuchAlgorithmException, InvalidKeyException {
            try {
                // 创建minioClient
                MinioClient minioClient =
                        MinioClient.builder()
                                .endpoint(endPoint + ":" + port)
                                .credentials(accessKey, secretKey)
                                .build();
    
                // 如果指定的bucket不存在,则创建,否则使用已有bucket
                boolean found =
                        minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
                if (!found) {
                    minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
                } else {
                    log.info("Bucket {} already exists", bucketName);
                }
    
                // 获取文件原始名称
                String oringinalName = file.getOriginalFilename();
                // 获取后缀
                String suffix = oringinalName.substring(oringinalName.lastIndexOf('.'));
                // 拼接存储后的文件名
                String fileName = UUID.randomUUID().toString() + suffix;
    
                PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(fileName)
                        .stream(file.getInputStream(), file.getSize(), -1)
                        .contentType(file.getContentType())
                        .build();
    
                minioClient.putObject(putObjectArgs);
                log.info("文件上传成功");
    
                // 拼接url并返回
                return endPoint + ":" + port + "/" + bucketName + "/" + fileName;
    
            } catch (MinioException e) {
                System.out.println("Error occurred: " + e);
                System.out.println("HTTP trace: " + e.httpTrace());
                return "error";
            }
        }
    }
    
    

    4、使用,定义一个文件上传的接口

    @RestController
    @Slf4j
    public class FileUploadController {
        @Autowired
        private MinioProperties minioProperties;
    
        /**
         * @ description 文件上传
         * @param file
         * @ return com.zyp.pojo.Result
         * @ author DELL
         */
        @PostMapping("/upload")
        public Result upload(MultipartFile file) throws Exception {
    
            String url = MinioUtil.upload(file, minioProperties.getEndpoint(), minioProperties.getPort(), minioProperties.getAccessKey(), minioProperties.getSecretKey(), minioProperties.getBucketName());
            log.info("url= {}",url);
    
            if(url.isEmpty() || url.equals("error")){
                throw new UploadErrorException("文件上传失败");
            }else{
                return Result.success(url);
            }
        }
    }
    
    

    常见问题

    1、tomcat限制了文件上传或者下载的大小
    解决:修改配置文件

    spring:
      servlet:
        multipart:
          max-file-size: 50MB
          max-request-size: 50MB
    

    本文作者:beiyuan888

    本文链接:https://www.cnblogs.com/beiyuan888/p/18226370

    版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

  • 相关阅读:
    《ESP8266通信指南》1-ESP8266 简介
    微型机器人群,隧道挖掘的未来之才
    【数据结构】静态分配的顺序表的删除元素
    速盾网络:cdn加速技术和云计算的区别
    如何学习渗透测试?怎样才能入行?
    明明拍毕业照
    Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格
    预测模块详解
    Linux常见的20个命令
    CloudCompare中CCCoreLib模块介绍
  • 原文地址:https://www.cnblogs.com/beiyuan888/p/18226370