最近工作中某地项目文件上传方式有了变动,所以MinIO进入了我的视野。
Minio与Amazon S3云存储服务兼容,采用Golang实现,服务端支持Windows、Linux、 OS X和FreeBSD等操作系统;客户端支持Java、Python、Javacript、 Golang语言,下面会有基于java的sdk的相关集成和操作。
Minio是Apache License v2.0下发布的对象存储服务器。它与Amazon S3云存储服务兼容。它最适合存储非结构化数据,如照片,视频,日志文件,备份和容器/ VM映像。对象的大小可以从几KB到最大5TB。。。

MinIO中国站点:http://www.minio.org.cn
MinIO中国镜像站:http://dl.minio.org.cn

MinIO中文官网

看了一些资料之后我对这个东西有了一个初步的认知,它与我使用过的阿里云OSS对象存储非常类似,通过endPoint(节点),accessKey(访问密钥),secretKey(密钥),bucketName(桶名,相当于文件夹名称) 这四个部分来实现外部访问和上传文件,不同的是minio需要自己去官网安装并且可以自己设置两种密钥(可以理解为自定义账号密码)

本地部署MinIO文件服务(Windows)

1.下载并启动

官网的说明

#我是使用Power shell进行下载操作的,也尝试过使用cmd命令行工具下载,但是失败了。
PS> Invoke-WebRequest -Uri "https://dl.min.io/server/minio/release/windows-amd64/minio.exe" -OutFile "F:\minio\minio.exe"
#设置登录的用户名和密码,对应accessKey和secretKey
PS> setx MINIO_ROOT_USER minioadmin
PS> setx MINIO_ROOT_PASSWORD minioadmin
#启动,address是客户端端口也是程序调用Minio接口要访问的端口,console-address是控制台的端口
PS> F:\minio\minio.exe server F:\minio\Data --address ":9001" --console-address ":9000"
启动成功的页面如下

启动成功

这是在自己电脑上部署的,所以直接访问127.0.0.1:9000就可以了。

2.创建桶

启动成功后用浏览器访问127.0.0.1:9000会出现如下界面:

minio主页面

然后我们创建一个桶(也就是创建一个文件夹,起名的时候可能会提示桶名不规范,重新取一个名字就行):

创建新的桶

到这里minio服务端的相关工作就做完了,接下来就在Java代码中集成minio

3.在Java代码中集成

引入jar包(我的版本是:7.0.2):

引入jar包

然后写一个MinIO的工具类,网上有很多可以自己找来用

package com.jg.gradlesptingdemo.controller;

import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.messages.Bucket;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import org.testng.annotations.Test;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.List;

import javax.annotation.PostConstruct;

/**
 * Minio工具类
 * @author JG
 */
@Slf4j
@Component
public class MinIoUtil {

    public static MinioClient minioClient;
    public static String endPoint = "http://127.0.0.1:9000";
    public static String accessKey = "minioadmin";
    public static String secretKey = "minioadmin";
    public static String bucketName = "yeye";

    /**
     * 初始化minio配置
     *
     * @param :
     * @return: void
     * @date : 2020/8/16 20:56
     */
    static{
        try {
            log.info("Minio Initialize........................");
            /*MinioServer minio = new MinioServer();
            minioClient = MinioClient.builder().endpoint(minio.getUrl())
                    .credentials(minio.getAccessKey(),minio.getSecretKey()).build();
                                createBucket(minio.getBucketName());*/
            minioClient = new MinioClient(endPoint, accessKey, secretKey);
            createBucket(bucketName);
            log.info("Minio Initialize........................successful");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("初始化minio配置异常: 【{}】", e.fillInStackTrace());
        }
    }

    /**
     * 判断 bucket是否存在
     *
     * @param bucketName:
     *            桶名
     * @return: boolean
     */
    @SneakyThrows(Exception.class)
    public static boolean bucketExists(String bucketName) {
        return minioClient.bucketExists(bucketName);
    }

    /**
     * 创建 bucket
     *
     * @param bucketName:
     *            桶名
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static void createBucket(String bucketName) {
        boolean isExist = minioClient.bucketExists(bucketName);
        if (!isExist) {
            minioClient.makeBucket(bucketName);
        }
    }

    /**
     * 获取全部bucket
     *
     * @param :
     * @return: java.util.List<io.minio.messages.Bucket>
     */
    @SneakyThrows(Exception.class)
    public static List<Bucket> getAllBuckets() {
        return minioClient.listBuckets();
    }

    /**
     * 文件上传
     *
     * @param bucketName:
     *            桶名
     * @param fileName:
     *            文件名
     * @param filePath:
     *            文件路径
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, String fileName, String filePath) {
        minioClient.putObject(bucketName, fileName, filePath, null);
        return getFileUrl(bucketName, fileName);
    }

    @Test
    public void uploadFileTest() {
        String fileName = "1.jpg";
        String path = "C:\\Users\\22727\\Desktop\\2.8\\1.jpg";
        String url = MinIoUtil.upload(bucketName, fileName, path);
        System.out.println(url);
    }
    @Test
    public void getFileUrlTest() {
        String fileName = "1.jpg";
        String url = MinIoUtil.getFileUrl(bucketName, fileName);
        System.out.println(url);
    }
    /**
     * 文件上传
     *
     * @param bucketName:
     *            桶名
     * @param fileName:
     *            文件名
     * @param stream:
     *            文件流
     * @return: java.lang.String : 文件url地址
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, String fileName, InputStream stream) {
        minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1));
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 文件上传
     *
     * @param bucketName:
     *            桶名
     * @param file:
     *            文件
     * @return: java.lang.String : 文件url地址
     */
    @SneakyThrows(Exception.class)
    public static String upload(String bucketName, MultipartFile file) {
        final InputStream is = file.getInputStream();
        final String fileName = file.getOriginalFilename();
        minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1));
        is.close();
        return getFileUrl(bucketName, fileName);
    }

    /**
     * 删除文件
     *
     * @param bucketName:
     *            桶名
     * @param fileName:
     *            文件名
     * @return: void
     */
    @SneakyThrows(Exception.class)
    public static void deleteFile(String bucketName, String fileName) {
        minioClient.removeObject(bucketName, fileName);
    }

    /**
     * 下载文件
     *
     * @param bucketName:
     *            桶名
     * @param fileName:
     *            文件名
     * @param response:
     * @return: void
     */
/*    @SneakyThrows(Exception.class)
    public static void download(String bucketName, String fileName, HttpServletResponse response) {
        // 获取对象的元数据
        final ObjectStat stat = minioClient.statObject(bucketName, fileName);
        response.setContentType(stat.contentType());
        response.setCharacterEncoding("UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        InputStream is = minioClient.getObject(bucketName, fileName);
        IOUtils.copy(is, response.getOutputStream());
        is.close();
    }*/

    /**
     * 获取minio文件的下载地址
     *
     * @param bucketName:
     *            桶名
     * @param fileName:
     *            文件名
     * @return: java.lang.String
     * @date : 2020/8/16 22:07
     */
    @SneakyThrows(Exception.class)
    public static String getFileUrl(String bucketName, String fileName) {
        return minioClient.presignedGetObject(bucketName, fileName);
    }

}

处理好对应的依赖关系后运行两个测试方法,控制台输出以下内容就说明我们的minio配置成功,可以正常使用了

启动成功

阿里云部署MinIO服务(Linux)

在阿里云服务器上部署MinIO服务与在Windows上部署步骤差不多,不同的是要云服务器要注意开放对应端口的防火墙。

1.下载并安装

访问MinIO国内镜像地址:https://dl.min.io/server/minio/release/linux-amd64/ ,一般下图的位置是最新的安装包,我们就下载这一个

MinIO安装包

执行命令:

#进入安装包存放的位置
cd /home/MinIO/
#下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio-20220704210254.0.0.x86_64.rpm

下载

下载完成后直接安装:

rpm -ivh minio-20220704210254.0.0.x86_64.rpm

安装

安装成功后使用命令查看minio服务状态:

systemctl status minio

查看minio服务状态

2.修改配置文件

出现类似这样的情况就说明安装成功了,只是这个时候先不要启动,需要修改 /etc/systemd/system/minio.service 文件,然后修改MinIO的用户名和group(可以修改为 root root)

修改配置文件

在(/etc/default/minio)配置文件中可以修改访问的账号和密码,也可以将该地址改为/etc/default/minio.conf,如果该目录下没有这个配置文件就自行创建。

#创建对应的配置文件
touch /etc/default/minio.conf
#编辑
vi /etc/default/minio.conf

加入如下配置内容并保存:

#上传文件的存放位置
MINIO_VOLUMES="/home/minio/data"
#address:客户端端口,也是接口调用端口
#console-address控制台访问端口
MINIO_OPTS="--address :9001 --console-address :9000"
#账号
MINIO_ACCESS_KEY=minioadmin
#密码
MINIO_SECRET_KEY=minioadmin123

3.启动

重新刷新,启动,查看状态:

#刷新
systemctl daemon-reload
#启动
systemctl start minio
#查看状态
systemctl status minio

启动成功:

启动成功

启动完成后还需要查看对应端口防火墙是否开放:

#查看当前端口是否打开:yes为打开
firewall-cmd --query-port=9000/tcp
 
#开启防火墙的9000端口
firewall-cmd --zone=public --add-port=9000/tcp --permanent

#查看防火墙的端口哪些是打开的
firewall-cmd --list-port

开启端口

我是阿里云的服务器,所以我还要开启云服务器外部访问的防火墙规则,直接进入服务器的控制台开启就行:

image-20220705092920199

4.代码中集成

接下来修改代码,把MinIO工具类中对应的配置参数改成服务器的就行,工具类的代码在上一节:本地部署MinIO文件服务(Windows)中

修改代码

最后修改:2022 年 07 月 05 日
去码头整点薯片?