MinIO的安装与使用

目录

1、安装MinIO

[1.1 下载 MinIO 可执行文件](#1.1 下载 MinIO 可执行文件)

[1.2 检查 MinIO 是否安装成功](#1.2 检查 MinIO 是否安装成功)

[1.3 设置数据存储目录](#1.3 设置数据存储目录)

[1.4 配置环境变量(可选)](#1.4 配置环境变量(可选))

[1.5 编写启动的脚本](#1.5 编写启动的脚本)

[1.6 开放端口](#1.6 开放端口)

[1.7 访问](#1.7 访问)

2、项目实战

[2.1 引入依赖](#2.1 引入依赖)

[2.2 配置yml文件](#2.2 配置yml文件)

[2.3 编写Minio配置类](#2.3 编写Minio配置类)

[2.4 编写Minio操作类](#2.4 编写Minio操作类)

[2.5 业务类](#2.5 业务类)

[2.6 测试](#2.6 测试)

1、安装MinIO

1.1 下载 MinIO 可执行文件

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

bash 复制代码
# 下载 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 是否安装成功:

bash 复制代码
minio --version

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

1.3 设置数据存储目录

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

bash 复制代码
sudo mkdir /app/minio/data

1.4 配置环境变量(可选)

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

bash 复制代码
export MINIO_ROOT_USER="***"
export MINIO_ROOT_PASSWORD="****"

1.5 编写启动的脚本

bash 复制代码
vim minio.sh
bash 复制代码
#!/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里面创建的数据存储路径并生成日志文件!

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

1.6 开放端口

bash 复制代码
systemctl start firewalld && firewall-cmd --permanent --add-port=9001/tcp && firewall-cmd --reload && firewall-cmd --query-port=9001/tcp
bash 复制代码
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 引入依赖

XML 复制代码
        <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文件

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

2.3 编写Minio配置类

java 复制代码
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操作类

java 复制代码
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 业务类

java 复制代码
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 测试

java 复制代码
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);
    }


}

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

相关推荐
m0_7482463540 分钟前
SpringBoot返回文件让前端下载的几种方式
前端·spring boot·后端
m0_748230441 小时前
创建一个Spring Boot项目
java·spring boot·后端
卿着飞翔1 小时前
Java面试题2025-Mysql
java·spring boot·后端
mcupro1 小时前
提供一种刷新X410内部EMMC存储器的方法
linux·运维·服务器
黑客老李1 小时前
区块链 智能合约安全 | 回滚攻击
服务器·数据仓库·hive·hadoop·区块链·php·智能合约
綦枫Maple1 小时前
Spring Boot(6)解决ruoyi框架连续快速发送post请求时,弹出“数据正在处理,请勿重复提交”提醒的问题
java·spring boot·后端
不知 不知2 小时前
最新-CentOS 7 基于1 Panel面板安装 JumpServer 堡垒机
linux·运维·服务器·centos
BUG 4042 小时前
Linux--运维
linux·运维·服务器
千航@abc2 小时前
vim在末行模式下的删除功能
linux·编辑器·vim
智_永无止境3 小时前
Springboot使用war启动的配置
java·spring boot·后端·war