Bootstrap

MinIO的安装与使用

目录

1、安装MinIO

1.1 下载 MinIO 可执行文件

1.2 检查 MinIO 是否安装成功

1.3 设置数据存储目录

1.4 配置环境变量(可选)

1.5 编写启动的脚本

1.6 开放端口

1.7 访问

2、项目实战

2.1 引入依赖

2.2 配置yml文件

2.3 编写Minio配置类

2.4 编写Minio操作类

2.5 业务类

2.6 测试

1、安装MinIO

1.1 下载 MinIO 可执行文件

        首先,下载 MinIO 的最新版本。你可以从 MinIO 官网下载或者使用 wget 直接下载。以下是使用 wget 下载并安装的步骤。

# 下载 MinIO 的可执行文件
wget https://dl.min.io/server/minio/release/linux-amd64/minio

# 为 MinIO 可执行文件添加执行权限
chmod +x minio

# 将 MinIO 移动到系统的可执行路径(例如 /usr/local/bin)
sudo mv minio /usr/local/bin/

1.2 检查 MinIO 是否安装成功

        通过以下命令验证 MinIO 是否安装成功:

minio --version

        如果安装成功,您会看到 MinIO 的版本信息。 

1.3 设置数据存储目录

        选择一个目录来存储 MinIO 的数据。例如,创建一个 /app/minio/data(这是我的目录,自行修改) 目录用于 MinIO 存储。

sudo mkdir /app/minio/data

1.4 配置环境变量(可选)

        可以通过设置环境变量来配置 MinIO 的 MINIO_ROOT_USERMINIO_ROOT_PASSWORD,这些凭证会用于访问 MinIO Web 控制台和 API。

export MINIO_ROOT_USER="***"
export MINIO_ROOT_PASSWORD="****"

1.5 编写启动的脚本

vim minio.sh
#!/bin/bash
#nohup启动服务 指定文件存放路径/app/minio/data 还有设置日志文件路径/app/minio/minio.log
nohup ./minio server --address :9000 --console-address :9001 /app/minio/data > /app/minio/minio.log 2>&1 &

注意:

1.--address指定了minio的api端口,--console-address指定了minio的可视化管理界面的端口!

2.如果1.4没有执行也可以把1.4的环境变量写在启动的脚本里面 !

3.指定了1.3里面创建的数据存储路径并生成日志文件!

# 赋权
chmod +x minio.sh
# 启动脚本
./minio.sh
#查看日志
cat /app/minio/minio.log

1.6 开放端口

systemctl start firewalld && firewall-cmd --permanent --add-port=9001/tcp && firewall-cmd --reload && firewall-cmd --query-port=9001/tcp
systemctl start firewalld && firewall-cmd --permanent --add-port=9000/tcp && firewall-cmd --reload && firewall-cmd --query-port=9000/tcp

 一定要开放9000和9001两个端口!

1.7 访问

http://ip:9001

如果1.3和1.4都没有配置环境变量,那么账号密码都为默认的minioadmin:minioadmin

2、项目实战

2.1 引入依赖

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.5.4</version>
        </dependency>
        <!-- minio8.3以上版本需要手动引入okhttp-->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.3</version>
        </dependency>

2.2 配置yml文件

####################################minio配置#################################
minio:
  #此处需注意,需要配置minio的api的端口,配置可视化管理界面的端口会导致接口不报错但是文件操作不了
  url: http://ip:9000
  access-key: *****
  secret-key: *****
  bucket-name: ****

2.3 编写Minio配置类

package com.example.config;

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

/**
 * <p>
 * Minio配置类
 * </p>
 *
 * @custom.date 2025/1/22 14:19
 */
@Data
@Configuration
public class MinioConfig {

    /**
     * 访问地址
     */
    @Value("${minio.url}")
    private String endpoint;

    /**
     * accessKey类似于用户ID,用于唯一标识你的账户
     */
    @Value("${minio.access-key}")
    private String accessKey;

    /**
     * secretKey是你账户的密码
     */
    @Value("${minio.secret-key}")
    private String secretKey;

    /**
     * 默认存储桶
     */
    @Value("${minio.bucket-name}")
    private String bucketName;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
    }

}

2.4 编写Minio操作类

package com.example.config;

import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@Component
@Configuration
public class MinioTemplate {

    public MinioTemplate() {}


    @Autowired
    private MinioConfig minioConfig;

    @Autowired
    private MinioClient minioClient;

    public void createBucket(String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        MinioClient minioClient = this.minioClient;
        if (!minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build())) {
            minioClient.makeBucket(
                    MakeBucketArgs.builder()
                            .bucket(bucketName)
                            .build());
        }
    }

    /**
     * 获取文件外链
     * @param bucketName bucket 名称
     * @param objectName 文件名称
     * @return
     */
    public String getObjectURL(String bucketName,String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        return this.minioClient.getPresignedObjectUrl(
                GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(objectName)
                        .build());
    }

    /**
     * 获取文件
     * @param bucketName
     * @param objectName
     * @return
     */
    public InputStream getObject(String bucketName,String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        return this.minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(objectName).build());
    }

    /**
     * 上传文件
     * @param bucketName
     * @param objectName
     * @param stream
     */
    public void putObject(String bucketName, String objectName, InputStream stream) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        //createBucket(bucketName);
        this.minioClient.putObject(
                PutObjectArgs.builder()
                        .bucket(bucketName)
                        .object(objectName)
                        .stream(stream, stream.available(), -1)
                        .build());
    }

    /**
     * 删除文件
     * @param bucketName
     * @param objectName
     */
    public void removeObject(String bucketName, String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        this.minioClient.removeObject(RemoveObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .build());
    }

    /**
     * 下载文件
     * @param bucketName
     * @param objectName
     */
    public InputStream downloadFile(String bucketName,String objectName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        return this.minioClient.getObject(GetObjectArgs.builder()
                .bucket(bucketName)
                .object(objectName)
                .build());
    }

}

2.5 业务类

package com.example.service;

import com.example.config.MinioTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.InputStream;

@Service
public class MinioStorageService {

    @Autowired
    private MinioTemplate minioTemplate;

    @Value("${minio.bucket-name}")
    private String bucketName;

    /**
     * 获取文件外链
     *
     * @param objectName 文件名称
     */
    public String getObjectURL(String objectName) {
        try {
            return minioTemplate.getObjectURL(bucketName, objectName);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public String uploadFile(InputStream inputStream, String filePath) {
        String path = null;
        try {
            minioTemplate.putObject(bucketName, filePath, inputStream);
            path = filePath;
        } catch (Exception e) {

        }
        return path;
    }

    public InputStream downloadFile(String filePath) {
        InputStream inputStream = null;
        try {
            inputStream = minioTemplate.getObject(bucketName, filePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return inputStream;
    }

    public void removeFile(String filePath){
        try{
            minioTemplate.removeObject(bucketName,filePath);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public void createBucket(String bucketName) {
        try {
            minioTemplate.createBucket(bucketName);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

2.6 测试

package com.example.controller;

import com.example.service.MinioStorageService;
import io.minio.errors.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

@RestController
public class MinioController {

    @Autowired
    private MinioStorageService minioStorageService;


    @RequestMapping("/createBucket")
    public void createBucket(@RequestParam("bucketName") String bucketName) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {
        minioStorageService.createBucket(bucketName);
    }

    @RequestMapping("/uploadFile")
    public void uploadFile(@RequestParam("file") MultipartFile file,@RequestParam("fileName") String fileName) throws IOException {
        minioStorageService.uploadFile(file.getInputStream(),fileName);
    }


}

上传成功后可以在控制台中看到这个文件 。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;