minio入门

8,132 阅读5分钟

一、认识MinIO

Minio是一个简单易用的云存储服务,就像是一个放在网络上的大文件柜。想象一下,你有一间放满了各种文件的房间,有时候你需要把这些文件分享给朋友或者在不同地方访问它们。Minio就是帮你做到这一点的工具,它让你可以轻松地把文件上传到互联网上,这样无论你在哪里,只要有网络,就能访问或分享这些文件。

现在,如果你想要从这个仓库里取出一张图片或一段视频,让网站的访客能看到或者下载,Minio和网站之间就需要配合完成几个步骤:

    1. 上传文件:首先,你通过Minio提供的接口或者工具,把视频或图片上传到Minio的服务器上。上传时,你可以设置一些额外的信息,告诉Minio这些文件是可以被公开访问的。
    1. 生成链接:当你要在网站上展示这些文件时,Minio能生成一个特殊的网址(我们叫做对象URL)。这个链接直接指向存储在Minio中的视频或图片。关键在于,这个链接可以设置一个有效期,过了时间就失效,保证安全性。
    1. 前端显示:网站的前端代码(就是浏览器能看到的部分)会用这个链接去请求Minio服务器上的视频或图片。当浏览器收到这些文件时,如果它们是图片,就会直接显示在页面上;如果是视频,则会在页面上嵌入一个播放器让用户观看。
    1. 下载功能:对于下载来说,其实也很简单。因为前端已经有了这个文件的直接链接,用户点击“下载”按钮时,浏览器就会使用这个链接开始下载文件到用户的电脑上,就像平时在网上下载东西一样。

二、minio部署

docker pull minio/minio 先拉取minio官方镜像

docker run -p 9000:9000 -p 9090:9090 \
 --name minio \
 -d --restart=always \
 -e "MINIO_ACCESS_KEY=minioadmin" \
 -e "MINIO_SECRET_KEY=minioadmin" \
 -v /mydata/minio/data:/data \
 minio/minio server \
 /data --console-address ":9090" -address ":9000"
  • -v:数据挂载。当 MinIO 将数据写入 /data时,该数据会镜像到本地路径/mydata/minio/data, 使其能够在容器重新启动时保持持久化。
  • --restart=always 设置重启策略,当容器因为某些原因停止后,Docker 会自动尝试重新启动容器。
  • -e 设置Api访问凭证的用户名、密码
  • minio/minio 是镜像名称;server是启动命令;/data 指定 Minio 服务存储数据的目录。
  • --console-address ":9090" -address ":9000" 控制台的访问地址ip+9090,api访问地址9000。

通过ip + 9090 输入账号密码后可正确进入minio首页

image.png

三、使用介绍

在对象存储服务里面,所有的文件都是以桶的形式来组织的。简单说,可以将桶看作是目录,这个目录下有很多的文件或者文件夹,这和其它云存储服务基本一致。

3.1 创建桶

所有的文件必须要存储到桶中,因此需要先创建存储桶。

image.png

若要修改存储桶信息,点击左侧的Buckets菜单,即可展示存储桶配置信息。

3.2 上传和下载文件

点击Object Browser菜单,可看到刚刚创建的存储桶kunkunclub-bucket,点击进入,上传想要存储的文件。

image.png

image.png

3.3 设置存储桶访问策略

默认创建的存储桶,均为私有桶,无法被公开访问。

image.png

以 api 方式直接访问,会提示无权限:

http://117.72.118.73:9000/kunkunclub-bucket/111.png

image.png

通常而言,要将数据写入操作进行控制;而读操作,很多不涉及安全问题,希望能被互联网公开访问,以便加快文件的访问速度。

可以在存储桶里面配置,将数据读取权限设置为公开访问。

image.png

再次访问可成功展示图片。

存储桶的 Access Policy 有三种:
Private 私有,不设置任何策略,如果设置 Anonymouse Access Role 将变成 Custom
Public 公开,任何人都拥有对该存储桶上传、下载、删除文件的能力。
Custom 自定义策略。

存储桶的 Anonymouse Access Role 有四种:
nonereadonywriteonlyreadwrite
除 none 外, Role 必须作用于 Prefix(文件路径前缀,一般设为/,允许查看所有路径的图片

四、springboot集成minio

4.1 获取minio的accessKey和secretKey

获取API访问凭证(在部署minio时指定了accessKey和secretKey都是minioadmin,所以不需要通过下面的方法获取):

image.png

image.png

4.2 编写yml配置文件

minio:
  url: http://117.72.118.73:9000
  accessKey: minioadmin
  secretKey: minioadmin

4.3 minio客户端配置类

package com.ssm.oss.config;

import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Minio配置管理
 */
@Configuration
public class MinioConfig {
    /**
     * minioUrl
     */
    @Value("${minio.url}")
    private String url;
    /**
     * Api访问凭证--账户
     */
    @Value("${minio.accessKey}")
    private String accessKey;
    /**
     * Api访问凭证--密码
     */
    @Value("${minio.secretKey}")
    private String secretKey;

    /**
     * 构造minio客户端
     * @return
     */
    @Bean
    public MinioClient getMinioClient() {
        return MinioClient.builder().endpoint(url).credentials(accessKey, secretKey).build();
    }
}

4.4 创建minio工具类

package com.ssm.oss.util;

import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.*;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * Minio文件操作工具类
 */
@Component
public class MinioUtil {
    @Resource
    private MinioClient minioClient;

    /**
     * 创建Bucket桶(文件夹目录)
     */
    public void createBucket(String bucket) throws Exception {
        boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
        if(!exists) { //不存在创建
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
        }
    }

    /**
     * 上传文件
     * inputStream:处理文件的输入流
     * bucket:桶名称
     * objectName:桶中的对象名称,也就是上传后的文件在存储桶中的存储路径和文件名。
     * stream(inputStream:处理文件的输入流,-1:指定缓冲区大小的参数[-1为默认大小], Integer.MAX_VALUE:指定文件内容长度的上限)
     */
    public void uploadFile(InputStream inputStream, String bucket, String objectName) throws Exception {
        minioClient.putObject(PutObjectArgs.builder().bucket(bucket).object(objectName)
                .stream(inputStream, -1, Integer.MAX_VALUE).build());
    }

}

4.5 测试

@RestController
public class FileController {
    @Resource
    private MinioUtil minioUtil;

    @PostMapping("/upload")
    public void test() throws Exception {
        minioUtil.createBucket("ssm");
    }
}

image.png