当前位置 : 主页 > 编程语言 > 其它开发 >

Minio的安装与使用

来源:互联网 收集:自由互联 发布时间:2022-05-30
Minio的安装与使用一、Minio介绍 MinIO 是在 Apache License v2.0 下发布的高性能对象存储. 就是说是个存东西的玩意,比较方便配好启动就能访问,也不用什么nginx转发啊什么东西的,简单方便
Minio的安装与使用 一、Minio介绍

MinIO 是在 Apache License v2.0 下发布的高性能对象存储.
就是说是个存东西的玩意,比较方便配好启动就能访问,也不用什么nginx转发啊什么东西的,简单方便。 就是上传文件下载文件的一个 嗯。。东西

二、服务端部署Minio

下载地址

image

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

//下载
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 &
//创建的所有桶都在 自定义配置目录下

image

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

三、java使用Minio (1)、先导入依赖
//maven
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>7.0.2</version>
</dependency>

//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<String> 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<String> listBucketNames()
            throws Exception {
        List<Bucket> bucketList = listBuckets();
        List<String> bucketListName = new ArrayList<>();
        for (Bucket bucket : bucketList) {
            bucketListName.add(bucket.name());
        }
        return bucketListName;
    }

    /**
     * 查看所有桶
     */
    public List<Bucket> 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<Result<Item>> myObjects = listObjects(bucketName);
            for (Result<Item> result : myObjects) {
                Item item = result.get();
                // 有对象文件,则删除失败
                if (item.size() > 0) {
                    return false;
                }
            }
            // 删除存储桶,注意,只有存储桶为空时才能删除成功。
            minioClient.removeBucket(bucketName);
            flag = bucketExists(bucketName);
            return !flag;

        }
        return false;
    }

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

    /**
     * 列出存储桶中的所有对象名称
     *
     * @param bucketName 存储桶名称
     */
    public List<String> listObjectNames(String bucketName) throws Exception {
        List<String> listObjectNames = new ArrayList<>();
        boolean flag = bucketExists(bucketName);
        if (flag) {
            Iterable<Result<Item>> myObjects = listObjects(bucketName);
            for (Result<Item> 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)、访问图片

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

设置访问权限为Public
image

剩下的可以慢慢玩~

迷途者寻影而行
网友评论