Minio的安装与使用

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

剩下的可以慢慢玩~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值