Minio使用及整合起步依赖

news2024/11/15 20:24:39

说明:Minio是开源的对象存储服务器,相当于免费版的OSS,本文介绍在Linux环境下部署Minio服务器,并在SpringBoot中使用,最后将Minio的代码打包成一个起步依赖。

安装&启动

第一步:下载

首先,在官网上下载服务器程序,非常简单,下载下来就是一个文件;

在这里插入图片描述

这里建议不要使用命令行的方式直接在服务器上输入 wget https://dl.min.io/server/minio/release/linux-amd64/minio 下载,网络环境不好,巨慢;

在这里插入图片描述

第二步:启动

下载完成后,是一个没有扩展名的文件,上传到云服务器上,在根目录下创建一个minio文件夹,把服务器程序放到这个文件夹里面;

在这里插入图片描述

在这里插入图片描述

输入下面两行命令,启动minio服务器;

chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
  • 第一行命令:给minio文件设置可执行权限;

  • 第二行命令:设置minio服务器的账号(admin)、密码(password),并启动,端口是9001;

注意密码位数不要过少,会启动失败,使用默认的就可以;

在这里插入图片描述

第三步:登录测试

启动完成后,就可以通过IP:端口的方式来访问了。需要注意,如果使用的是云服务器,需要开放9001端口;

在这里插入图片描述

在页面中输入地址,访问到minio的管理平台;

在这里插入图片描述

第四步:使用

如果有使用过OSS,就会非常熟悉这些界面上的操作;

在这里插入图片描述

创建一个桶,设置为public,后面在代码中使用;

在这里插入图片描述

创建完bucket后,可以直接把文件资源上传到Minio上;

在这里插入图片描述

代码使用

第一步:创建项目

首先,创建一个简单的SpringBoot项目,只加入下面两个依赖,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hzy</groupId>
    <artifactId>minio-simple</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <!--Springboot项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--启动类依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--minio依赖-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.4.3</version>
        </dependency>
    </dependencies>
</project>

第二步:创建配置类

创建Minio所需要的配置文件类,另外注入一个MinioClient对象到IOC容器中;

import io.minio.MinioClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;

@ConfigurationProperties(prefix = "minio")
public class MinioConfig {

    private String endpoint;
    private String bucketName;
    private String accessKey;
    private String secretKey;

    public String getEndpoint() {
        return endpoint;
    }

    public void setEndpoint(String endpoint) {
        this.endpoint = endpoint;
    }

    public String getBucketName() {
        return bucketName;
    }

    public void setBucketName(String bucketName) {
        this.bucketName = bucketName;
    }

    public String getAccessKey() {
        return accessKey;
    }

    public void setAccessKey(String accessKey) {
        this.accessKey = accessKey;
    }

    public String getSecretKey() {
        return secretKey;
    }

    public void setSecretKey(String secretKey) {
        this.secretKey = secretKey;
    }

    /**
     * 创建一个Minio客户端
     * @return
     */
    @Bean
    public MinioClient createMinioClient(){
        return MinioClient
                .builder()
                .endpoint(endpoint)
                .credentials(accessKey,secretKey)
                .build();
    }
}

第三步:创建操作类

创建一个Minio操作的工具类,如下,更多请参考(http://t.csdn.cn/hHfDK):

import com.hzy.config.MinioConfig;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Optional;

/**
 * MinIO工具类
 */
@Component
@EnableConfigurationProperties(MinioConfig.class)
public class MinioUtils {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private MinioConfig minIOConfig;

    /**
     * 创建基于Java端的MinioClient
     */
    public void createMinioClient() {
        if (null == minioClient) {
            minioClient = MinioClient
                    .builder()
                    .endpoint(minIOConfig.getEndpoint())
                    .credentials(minIOConfig.getAccessKey(), minIOConfig.getSecretKey())
                    .build();
            try {
                createBucket(minIOConfig.getBucketName());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 启动SpringBoot容器的时候初始化Bucket
     * 如果没有Bucket则创建
     *
     * @throws Exception
     */
    private void createBucket(String bucketName) throws Exception {
        if (!bucketExists(bucketName)) {
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }
    }

    /**
     * 判断Bucket是否存在,true:存在,false:不存在
     *
     * @return
     * @throws Exception
     */
    public boolean bucketExists(String bucketName) throws Exception {
        return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
    }

    /**
     * 使用MultipartFile进行文件上传
     *
     * @param bucketName  存储桶
     * @param fileBytes   文件字节数组
     * @param objectName  对象名
     * @param contentType 类型
     * @return
     * @throws Exception
     */
    public ObjectWriteResponse uploadFile(String bucketName, byte[] fileBytes, String objectName,
                                          String contentType) throws Exception {

        InputStream inputStream = new ByteArrayInputStream(fileBytes);

        return minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .contentType(contentType)
                        .stream(inputStream, inputStream.available(), -1)
                        .build());
    }
}

第四步:添加配置

设置配置文件,如下,注意哦,Minio代码端连接的端口是9000,所以如果使用的是云服务器,需要开通此端口;

minio:
  endpoint: http://Minio服务器IP:9000
  bucketName: simple
  accessKey: admin
  secretKey: password

第五步:创建Controller启动

最后,创建一个Controller,启动,测试;

import com.hzy.utils.MinioUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

@RestController
public class MinioController {

    @Autowired
    private MinioUtils minioUtils;

    @PostMapping("upload")
    public void uploadImage(MultipartFile file){
        try {
            minioUtils.uploadFile("simple", file.getBytes(), "pic", file.getContentType());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

第六步:上传文件测试

使用Apifox,填上地址、请求方式为POST、请求数据为Body,表单、参数名file(要与controller层一致)、选择文件;

在这里插入图片描述

发送完成后,查看Minio管理平台,查看文件;

在这里插入图片描述

可以看到,图片已上传成功;

在这里插入图片描述

这时,点击图片,右边有个Share,点击,在弹出的窗口里可以看到该图片的连接;

在这里插入图片描述

但是注意哦,这个链接是假链接,无效的,将这个链接修改成如下才可以访问到图片:

http://Minio服务器IP:9000/bucket名/文件路径

在这里插入图片描述

第七步:优化

而这个路径,我们是可以在代码里拼接的,比如上传图片后我们需要将此地址存入到数据库中,就可以将代码改成下面这样:

@RestController
public class MinioController {

    @Autowired
    private MinioUtils minioUtils;

    @Autowired
    private MinioConfig minioConfig;

    @PostMapping("upload")
    public String uploadImage(MultipartFile file) {
        // 生成UUID作为文件的名称
        String fileName = UUID.randomUUID() + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
        try {
            // 上传到Minio上
            minioUtils.uploadFile(minioConfig.getBucketName(), file.getBytes(), fileName, file.getContentType());
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 文件的路径,可存入数据库
        return minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() + "/" + fileName;
    }
}

发送图片测试;

在这里插入图片描述

打开这个链接,可以访问到这张图片;

在这里插入图片描述

当然,这还是非常粗糙的,在项目中使用需要考虑到图片大小和格式校验、目录分级、图片审核等等;

起步依赖

第一步:创建项目

首先,先另外创建一个SpringBoot项目,用来测试Minio起步依赖,pom文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hzy</groupId>
    <artifactId>starter-simple</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <!--Springboot项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>

    <dependencies>
        <!--启动类依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--minio起步依赖-->
        <dependency>
            <groupId>com.hzy</groupId>
            <artifactId>minio-simple</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>
</project>

第二步:剪切代码

把前面Minio项目中的controller层代码、application.yml配置都剪切过来,如下:

在这里插入图片描述

第三步:修改Minio依赖

Minio作为起步依赖,为了方别其他模块引用使用,原则是尽可能少的引用其他依赖,降低其他模块使用的成本,所以需要进行一些裁剪;

那么,如果不太清楚该去掉哪些依赖,我的一个方法是,先去掉依赖,然后根据报错的注解,再按提示添加对应的依赖,这样可以尽可能少的添加依赖。

(去掉Minio-simple项目中的parent标签的内容,代码报错,依据提示添加依赖)
在这里插入图片描述

按照提示,minio-simple项目加入以下依赖即可

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.hzy</groupId>
    <artifactId>minio-simple</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <!--minio依赖-->
        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.4.3</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.27</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
            <version>2.7.12</version>
            <scope>compile</scope>
        </dependency>
    </dependencies>

</project>

改造完成后,强烈建议启动starter-simple项目(demo项目),测试一下功能是否还能跑通;

在这里插入图片描述


在这里插入图片描述

第四步:执行install命令

在minio-simple项目中的Maven中,跳过test,执行install命令,安装此项目到本地仓库中;
在这里插入图片描述

执行完成;

在这里插入图片描述

此时,可以在本地仓库中找到此Maven;

在这里插入图片描述

第五步:测试

最后一步,也是最重要的一步,测试该起步依赖是否整合成功。

首先,需要把前面的minio-simple项目移除项目空间,有些同学忽略了此步骤,测试成功后就认为起步依赖整合完成了,其实不是哈,这样子使用的仍然是minio-simple项目中的代码,而不是本地仓库的jar包;

在这里插入图片描述

确认一下,pom.xml中添加了Minio起步依赖的Maven坐标;

在这里插入图片描述

启动项目;

在这里插入图片描述

测试完成;

在这里插入图片描述

至此,Minio起步依赖整合完成,以后别的项目中,可以直接在项目中引入该依赖,自动装配对应的Bean对象,使用对应的方法;

总结

Minio与OSS差不多,但是开源、免费,推荐使用;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853619.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用vue-grid-layout时 You may need an appropriate loader to handle this file type.

使用vue-grid-layout时 You may need an appropriate loader to handle this file type. node版本不匹配 我的node v14.16.0 vue-gride-layout 需要用 v 2.3.7的版本 卸载后重新安装即可

诺瓦星云面试汇总

1、C语言向一个内存地址写值&#xff0c; int main() {int value 42;int *ptr (int *)0x12345678; // Replace with the desired memory address*ptr value 2、申请释放内存 申请内存int *dynamicArray (int*)malloc(size *sizeof(int));释放内存 free(dynamicArray)…

哪些国家可以申请访问学者?

根据知识人网的小编了解&#xff0c;许多国家都允许外国学者申请访问并参与学术交流。这些国家提供了丰富多样的研究机会&#xff0c;有助于促进全球学术合作与知识交流。以下是一些允许申请访问学者的国家&#xff1a; 1. 美国&#xff1a;作为全球科研领域的重要一员&#xf…

远景智能PMO负责人严晓婷受邀为第十二届中国PMO大会演讲嘉宾

上海远景科创智能科技有限公司PMO负责人严晓婷女士受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;能源物联网产品标准项目和非标准项目的并行管理。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1…

《合成孔径雷达成像算法与实现》Figure3.6

代码复现如下&#xff1a; clc clear all close all%参数设置 TBP 100; %时间带宽积 T 10e-6; %脉冲持续时间%参数计算 B TBP/T; …

【回眸】AurixTC397的MPS8875A开发之展频篇

目录 前言 【回眸】AurixTC397的MPS8875A开发之展频篇 知识储备 看懂芯片手册 调整寄存器写入值 修改写入寄存器代码 修改主函数代码 验证和测量 前言 因公需要&#xff0c;大半年来一直对AurixTC397进行开发。实物板子特别大&#xff0c;有很多很多芯片&#xff0c;具…

2023-08-09 ssh-add id_rsa 提示Permissions 0777 for ‘id_rsa‘ are too open

一、ssh-add id_rsa 提示Permissions 0777 for id_rsa are too open Permissions 0777 for id_rsa are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored.二、意思是说公钥文件权限太宽了&#xff0c;需…

【校招VIP】java语言考点之基本数据类型

考点介绍&#xff1a; 基本数据类型的长度、自动升级、JVM存储和封装类的相关考点&#xff0c;是校招常见考点。基础考点不能出错 一、考点题目 1、JAVA 中的几种基本数据类型是什么&#xff0c;各自占用多少字节解答&#xff1a;先了解2个单词先&#xff1a;1、bit --位&am…

Kubernetes集群部署 集群网络未部署

环境 > 192.168.50.53 k8s-master > 192.168.50.51 k8s-node1 > 192.168.50.50 k8s-node2 必须不能少于两核两G 所有主机共同操作 主机初始化配置 所有主机配置禁用防火墙和selinux [rootserver ~]# setenforce 0 [rootserver ~]# iptables -F [rootserver ~]…

form中表单切换,导致 relus 中的事件无法触发,原因:页面切换不要一直切换DOM,会导致问题,需要都显示出来

修改前&#xff0c;因为重复渲染DOM导致绑定rules失效 修改前代码使用 computed 计算出渲染的DOM&#xff0c;影响rules事件<el-formref"form"inline:model"billDetailCopy":rules"rules"size"small"label-position"right&quo…

使用无监督机器学习进行客户细分 -- 机器学习项目基础篇(11)

在今天的时代&#xff0c;公司努力工作&#xff0c;使他们的客户满意。他们推出新的技术和服务&#xff0c;以便客户可以更多地使用他们的产品。他们试图与每一个客户保持联系&#xff0c;以便他们能够相应地提供货物。但实际上&#xff0c;与每个人保持联系非常困难和不现实。…

Springboot项目集成Durid数据源和P6Spy以及dbType not support问题

项目开发阶段&#xff0c;mybatis的SQL打印有占位符&#xff0c;调试起来还是有点麻烦&#xff0c;随想整合P6Spy打印可以直接执行的SQL&#xff0c;方便调试&#xff0c;用的Durid连接池。 Springboot项目集成Durid <dependency><groupId>com.alibaba</group…

【Matlab】极限学习机遗传算法(ELM-GA)函数极值寻优——非线性函数求极值

往期博客&#x1f449; 【Matlab】BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值 【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值 【Matlab】RBF神经网络遗传算法(RBF-GA)函数极值寻优——非线性函数求极值 【Matlab】Elman神经网络遗…

栈和队列 (以及实现)

文章内容 1.栈 2.队列 文章内容 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last I…

软件测试还是测试开发,二者如何选择?

各位小伙伴大家好, 今天和大家分享的是测试和测试开发的选择&#xff0c;相信很多小伙伴在这个问题上也都有过自己的想法&#xff0c;闲言少叙, 咱们进入正题。 一.企业需要哪种人才&#xff1f; 一名优秀的测试工程师是市面上不可多得的人才, 拥有理论和实操能力的测试工程师…

“代言人+合伙人“模式,彻底改变传统的一对一代言活动

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 当今…

MyBatis 实战指南:探索灵活持久化的艺术

文章目录 前言一、初识 MyBatis1.1 什么是 MyBatis1.2 为什么学习 MyBatis 二、MyBatis 在软件开发框架中的定位三、基于 Spring Boot 创建 MyBatis 项目3.1 添加 MyBatis 框架的支持3.2 配置数据库连接信息和映射文件的保存路径&#xff08;Mapper XML&#xff09; 四、MyBati…

8月11日|CSA研讨会:国标要点解读《信息安全技术 个人信息处理中告知和同意实施指南》

随着网络与数据科技的进步&#xff0c;个人信息在AIGC、元宇宙世界等产业中扮演着愈发关键的角色。如何实施告知并取得个人主体同意是个人信息处理的基本前提&#xff0c;对于企业等处理者而言尤为重要。《个人信息保护法》规定了知情同意的原则和一般规则&#xff0c;但仍有不…

网络适配器和MAC地址

点对点信道&#xff1a;由于目的地只有一个选项&#xff0c;所以数据链路层不需要使用地址。 而在广播信道中&#xff1a; 各个主机如何判断信号是不是发给自己的&#xff1f; 当多个主机连接在同一个广播信道上&#xff0c;要想实现两个主机之间的通信&#xff0c;则每个主机都…

字段附加属性

字段附加属性 除了查看、编辑、必填三个基本属性之外,在Html模板中可以对单个字段添加Sql操作,或者进行字段赋值和日期时间计算,这也是Html模板表单的一大特色,如图D5-4-1所示。 D5-4-1 5.5.2、插入sql操作 插入sql操作是通过写sql查询语句的方式将需要的内容查询出来后…