Minio的安装与使用

Minio的安装与使用

一、Minio介绍

MinIO 是在 Apache License v2.0 下发布的高性能对象存储.

就是说是个存东西的玩意,比较方便配好启动就能访问,也不用什么nginx转发啊什么东西的,简单方便。 就是上传文件下载文件的一个 嗯。。东西

二、服务端部署Minio

下载地址

Minio的安装与使用

看的出来,用起来很简单,下面就三行命令。从下载到启动

//下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio
//放到工作目录下执行,放权
chmod +x minio
//启动 可以在 服务器的 9001 端口进入 账号密码如下
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
//配置启动
./minio server /自定义Minio的配置目录
//启动后会生成一个文件夹,修改config/config.json
access_key = 账号
secret_key = 密码
//后台挂起
nohup 二进制文件所在目录 server  自定义配置目录 > 自定义启动日志.log 2>&1 &
//例如
nohup /usr/minio server  /usr/con > /usr/minio.log 2>&1 &
//创建的所有桶都在 自定义配置目录下

Minio的安装与使用

桶的概念,我的理解是一个父级目录,比如说创建桶1放视频,桶2放图片啊之类的

三、java使用Minio

(1)、先导入依赖

//maven

    io.minio
    minio
    7.0.2

//Gradle
implementation 'io.minio:minio:7.0.2'

另外本人建议不要用最新版的,貌似每个版本更新的都挺大,会导致很多api不能用,代码改动之大跟重构了一样

(2)、编写工具类

@Component
public class MinioHelper {
    //桶名称
    private String bucket;
    //远程主机地址
    private String host;
    //主机/桶名称/
    private String url;
    //账号
    private String accessKey;
    //密码
    private String secretKey;
    private MinioClient minioClient;

    @PostConstruct
    public void init() throws Exception {
        this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);
    }

    /**
     * 上传
     *
     * @param request
     * @param num
     */
    public List putObject(MultipartFile multipartFile) throws Exception {
        // bucket 不存在,创建
        if (!minioClient.bucketExists(this.bucket)) {
            minioClient.makeBucket(this.bucket);
        }
        InputStream inputStream;
        try {
        inputStream = Objects.requireNonNull(multipartFile).getInputStream();
        // PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
        PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
        // 文件的ContentType
        putObjectOptions.setContentType(multipartFile.getContentType());
        //UUID生成唯一文件名 加 文件后缀名
        String imgName = UUID.randomUUID().toString().replace("-", "") + Objects.requireNonNull(multipartFile.getOriginalFilename()).substring(multipartFile.getOriginalFilename().lastIndexOf("."));
        //上传
        minioClient.putObject(this.bucket, imgName, inputStream, putObjectOptions);
        //返回可访问路径
        this.url + UriUtils.encode(imgName, StandardCharsets.UTF_8)
        } catch (Exception ex) {
            throw new CustomizeException(ErrorCode.UP_IMAGE_ERROR);
        }
        return 上边那个可访问路径;
    }

    /**
     * 列出所有存储桶名称
     */
    public List listBucketNames()
            throws Exception {
        List bucketList = listBuckets();
        List bucketListName = new ArrayList<>();
        for (Bucket bucket : bucketList) {
            bucketListName.add(bucket.name());
        }
        return bucketListName;
    }

    /**
     * 查看所有桶
     */
    public List listBuckets()
            throws Exception {
        return minioClient.listBuckets();
    }

    /**
     * 检查存储桶是否存在
     */
    public boolean bucketExists(String bucketName)
            throws Exception {
        return minioClient.bucketExists(bucketName);
    }

    /**
     * 创建存储桶
     */
    public boolean makeBucket(String bucketName)
            throws Exception {
        boolean flag = bucketExists(bucketName);
        if (!flag) {
            minioClient.makeBucket(bucketName);
            return true;
        } else {
            return false;
        }
    }

    /**
     * 删除桶
     */
    public boolean removeBucket(String bucketName)
            throws Exception {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            Iterable> myObjects = listObjects(bucketName);
            for (Result result : myObjects) {
                Item item = result.get();
                // 有对象文件,则删除失败
                if (item.size() > 0) {
                    return false;
                }
            }
            // 删除存储桶,注意,只有存储桶为空时才能删除成功。
            minioClient.removeBucket(bucketName);
            flag = bucketExists(bucketName);
            return !flag;

        }
        return false;
    }

    /**
     * 列出存储桶中的所有对象
     */
    public Iterable> listObjects(String bucketName)
            throws Exception {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            return minioClient.listObjects(bucketName);
        }
        return null;
    }

    /**
     * 列出存储桶中的所有对象名称
     *
     * @param bucketName 存储桶名称
     */
    public List listObjectNames(String bucketName) throws Exception {
        List listObjectNames = new ArrayList<>();
        boolean flag = bucketExists(bucketName);
        if (flag) {
            Iterable> myObjects = listObjects(bucketName);
            for (Result result : myObjects) {
                Item item = result.get();
                listObjectNames.add(item.objectName());
            }
        }
        return listObjectNames;
    }

    /**
     * 删除一个对象
     *
     * @param bucketName 存储桶名称
     * @param objectName 存储桶里的对象名称
     */
    public boolean removeObject(String bucketName, String objectName)
            throws Exception {
        boolean flag = bucketExists(bucketName);
        if (flag) {
            minioClient.removeObject(bucketName, objectName);
            return true;
        }
        return false;

    }

    /**
     * 文件访问路径
     *
     * @param bucketName 存储桶名称
     * @param objectName 存储桶里的对象名称
     */
    public String getObjectUrl(String bucketName, String objectName) throws Exception {
        boolean flag = bucketExists(bucketName);
        String url = "";
        if (flag) {
            url = minioClient.getObjectUrl(bucketName, objectName);
        }
        return url;
    }
}

这样就可以上传文件了,至于说上传多文件,也是用循环去上传。
值得注意的是,SpringBoot默认上传文件大小为 1MB,所以需要配置一下

#解决过滤器导致文件传不过来
  servlet:
    multipart:
      max-file-size: 单文件最大 大小
      max-request-size: 一次请求发送的文件最大 大小

如果你配置了过滤器则需要

   mvc:
    hiddenmethod:
      filter:
        enabled: true

这连个都是Spring下的配置

(3)、访问图片

如果你惊奇的发现图片无法访问,那么进去管理后台找到你的那个桶,然后

Minio的安装与使用

设置访问权限为Public

Minio的安装与使用

剩下的可以慢慢玩~

迷途者寻影而行

Original: https://www.cnblogs.com/pkkyh/p/16221632.html
Author: 迷途者寻影而行
Title: Minio的安装与使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/575731/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • MySQL–数据过滤(AND、OR、IN、NOT操作符)

    MySQL允许给出多个WHERE子句。这些子句可以两种方式使用:以AND子句的方式或OR子句的方式使用。 1、组合WHERE子句 此SQL语句检索由供应商1003制造且价格小于等于…

    数据库 2023年6月16日
    089
  • xcopy自动化案例

    xcopy自动化案例 @echo off title xcopy U8BAK by huanu set "NYR=%date:~0,4%%date:~5,2%%date:…

    数据库 2023年6月9日
    089
  • 啥是Session?

    什么是 Session 会话? 1、Session 就一个接口(HttpSession)。2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。3、每个客…

    数据库 2023年6月11日
    076
  • JavaScript基本知识点——带你逐步解开JS的神秘面纱

    JavaScript基本知识点——带你逐步解开JS的神秘面纱 在我们前面的文章中已经深入学了HTML和CSS,在网页设计中我们已经有能力完成一个美观的网页框架 但仅仅是网页框架不足…

    数据库 2023年6月14日
    0103
  • MySQL Operator 02 | 脚手架选型 & 工程创建

    高日耀 资深数据库内核研发毕业于华中科技大学,喜欢研究主流数据库架构和源码,并长期从事分布式数据库内核研发。曾参与分布式 MPP 数据库 CirroData 内核开发(东方国信),…

    数据库 2023年5月24日
    0105
  • 创建镜像(alpine版)+alpine

    podman用脚本和dockerfile做apache编译安装镜像 1.0安装介质 2.0 特点 2.0 基础命令 3.0 模式 podman用脚本和dockerfile做apac…

    数据库 2023年6月14日
    0101
  • The user specified as a definer(‘mysql.infochema’@”localhost’) does not exist

    最近将之前用的 mysql5.5 升级到了 mysql8.0,第一天还能正常使用,几天没用后,登录发现报错:The user specified as a definer (&#8…

    数据库 2023年6月6日
    082
  • Executor 创建线程

    Executors创建有四种创建方式: newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIF…

    数据库 2023年6月9日
    0100
  • 分享攒了多年的mssql脚本

    分享攒了多年的mssql脚本 脚本类别包括:备份还原表分区常用函数错误日志定时自动抓取耗时SQL并归档发邮件脚本模块镜像批量脚本数据库收缩数据库损坏数据库账号统计数据库大小性能作业…

    数据库 2023年6月9日
    090
  • List集合分页处理的方法

    参考https://www.cnblogs.com/cmz-32000/p/12186362.html 解决了数组越界问题 参数页码大于总页码时返回null(可根据自己业务调整为返…

    数据库 2023年6月11日
    079
  • 4、异常

    一、异常的体系结构: java.lang.Throwable |—–java.lang.Error:一般不编写针对性的代码进行处理。 |—&#8…

    数据库 2023年6月6日
    093
  • Mybatis-Spring源码分析

    Mybatis-Spring 博主技术有限,本文难免有错误的地方,如果您发现了欢迎评论私信指出,谢谢JAVA技术交流群:737698533 当我们使用mybatis和spring整…

    数据库 2023年6月16日
    094
  • 项目主干分支的server.sh被“覆盖”了?一个配置,解除烦恼

    我司项目利用springboot搭建,应用在部署到各环境后,程序启动命令靠的是我们在工程里配置的 scripts/server.sh。这个server.sh里最重要的东西是程序启动…

    数据库 2023年6月9日
    0108
  • MySQL学习(3)—MySQL常用命令

    ps:此随笔基于mysql 5.7.*版本。 准备 net start mysql 启动MySQL服务 net stop mysql 关闭MySQL服务 mysql [-h exi…

    数据库 2023年5月24日
    083
  • 23种设计模式之责任链模式

    文章目录 概览 责任链模式的优缺点 责任链模式的结构和实现 * 模式的结构 模式的实现 总结 ; 概览 责任链模式(Chain of Responsibility Pattern)…

    数据库 2023年6月6日
    098
  • 数据库的常用命令

    1. 数据操作类语句: SELECT:&#x4ECE;&#x6570;&#x636E;&#x5E93;&#x8868;&#x4E2D…

    数据库 2023年6月14日
    099
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球