转载:https://blog.csdn.net/qq_45765384/article/details/136342425
Minio介绍
目前可用于文件存储的网络服务选择也有不少,比如阿里云OSS、七牛云、腾讯云等等,可是收费都有点小贵。为了节约成本,很多公司使用MinIO做为文件服务器。
官网:https://www.minio.org.cn/
MinIO是一个开源的分布式对象存储服务器,支持S3协议并且可以在多节点上实现数据的高可用和容错。它采用Go语言开发,拥有轻量级、高性能、易部署等特点,并且可以自由选择底层存储介质。它基于Apache License 开源协议,兼容Amazon S3云存储接口。适合存储非结构化数据,如图片,音频,视频,日志等。
MinIO的主要特点包括:
- 1、高性能:MinIO基于GO语言编写,具有高速、轻量级、高并发等性能特点,还支持多线程和缓存等机制进行优化,可以快速地处理大规模数据。
- 2、安装部署简单:MinIO只需要执行这几行命令便可轻松搞定,也大大降低了学习和维护成本。
- 3、操作简单,自带管理界面:MinIO在服务端安装后就自带了UI界面,可谓开箱即用。
- 4、性能优秀,读写速度快:MinIO号称是世界上速度最快的对象存储服务器,读对象的速度能达到183 GB/s,写对象的速度能达到171 GB/s。
- 5、支持云原生容器化部署:MinIO提供了与K8s、ETCD、Docker等容器化技术深度集成方案,可以说MinIO就是为云环境而生的。
- 6、提供多语言SDK的支持:MinIO提供了绝大部分主流开发语言的SDK以及文档,比如Java、Python、Golang、JS、.NET等等。
- 7、兼容亚马逊S3 API:亚马逊云的 S3 API(接口协议) 是在全球范围内达到共识的对象存储的协议,是全世界认可的对象存储标准。而MinIO是采用S3兼容协议的产品之一。
S3协议是Amazon Web Services (AWS) 提供的对象存储服务(Simple Storage Service)的API协议。它是一种 RESTful风格的Web服务接口,使用HTTP/HTTPS协议进行通信,支持多种编程语言和操作系统,并实现了数据的可靠存储、高扩展性以及良好的可用性。
Linux 安装(Docker)
具体命令:
//拉取镜像 docker pull minio/minio // 创建数据存储目录 mkdir -p /mnt/minio/data // 创建minio docker run \ -p 9000:9000 \ -p 9001:9001 \ --name minio \ -v /mnt/minio/data:/data \ -e "MINIO_ROOT_USER=ROOTNAME" \ -e "MINIO_ROOT_PASSWORD=CHANGEME123" \ -d \ minio/minio server /data --console-address ":9001"
上面的示例以以下方式工作:
mkdir创建一个新的本地目录/mnt/minio/data映射给容器内部的/data使用。docker run启动运行容器。-p为容器绑定一个本地的端口.-name为容器创建一个本地的名字。-v将文件路径设置为容器使用的持久卷位置。 当MinIO将数据写入/data时,该数据会镜像到本地路径/mnt/minio/data, 使其能够在容器重新启动时保持持久化。 您可以设置任何具有读取、写入和删除权限的文件路径来使用。-e分别为用户名和密码设置环境变量MINIO_ROOT_USER和MINIO_ROOT_PASSWORD. 这些说明了如下设置: 如何修改默认管理员的用户名和密码. 将示例值更改为您要用于容器的值。
容器启动以后,可以通过控制台访问 MinIO Console控制台。
云服务器地址:9001 端口 http://123.57.xxx.xxx:9001/

Java 操作 Minio
本章节会给大家介绍一下如何通过Java客户端操作Minio,可以参考官网地址。
官网地址:https://min.io/docs/minio/linux/developers/java/minio-java.html
具体步骤:
1、加入如下依赖
<!-- common-util模块中加入如下依赖 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.2</version>
</dependency>
2、示例代码
public class FileUploadTest {
public static void main(String[] args) throws Exception {
// 创建一个Minio的客户端对象
MinioClient minioClient = MinioClient.builder()
.endpoint("http://127.0.0.1:9000")
.credentials("minioadmin", "minioadmin")
.build();
boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket("spzx-bucket").build());
// 如果不存在,那么此时就创建一个新的桶
if (!found) {
minioClient.makeBucket(MakeBucketArgs.builder().bucket("spzx-bucket").build());
} else { // 如果存在打印信息
System.out.println("Bucket 'spzx-bucket' already exists.");
}
FileInputStream fis = new FileInputStream("D://01.jpg") ;
PutObjectArgs putObjectArgs = PutObjectArgs.builder()
.bucket("spzx-bucket")
.stream(fis, fis.available(), -1)
.object("01.jpg")
.build();
minioClient.putObject(putObjectArgs) ;
// 构建fileUrl
String fileUrl = "http://127.0.0.1:9000/spzx-bucket/01.jpg" ;
System.out.println(fileUrl);
}
}
注意:设置minio的中该桶的访问权限为public,如下所示:

NodeJs 操作 Minio
- 安装依赖
npm install minio
- 完整示例代码
const Minio = require('minio');
// 初始化 MinIO 客户端(社区版与商业版使用相同的 SDK)
const minioClient = new Minio.Client({
endPoint: 'localhost', // MinIO 服务器地址
port: 9000, // 端口
useSSL: false, // 是否使用 SSL(生产环境建议开启)
accessKey: 'minioadmin', // 默认 Access Key(测试环境)
secretKey: 'minioadmin' // 默认 Secret Key(测试环境)
});
// 桶名称和文件路径
const bucketName = 'my-bucket';
const objectName = 'example.txt';
const localFilePath = './local-file.txt';
const downloadPath = './downloaded.txt';
// 示例:完整的 MinIO 操作流程
async function runExample() {
try {
// 1. 创建存储桶(如果不存在)
const bucketExists = await minioClient.bucketExists(bucketName);
if (!bucketExists) {
await minioClient.makeBucket(bucketName);
console.log(`✅ 存储桶 "${bucketName}" 创建成功`);
} else {
console.log(`ℹ️ 存储桶 "${bucketName}" 已存在`);
}
// 2. 上传文件
await minioClient.fPutObject(bucketName, objectName, localFilePath);
console.log(`✅ 文件 "${localFilePath}" 已上传为 "${objectName}"`);
// 3. 生成预签名 URL(用于临时访问,无需凭证)
const presignedUrl = await minioClient.presignedGetObject(
bucketName,
objectName,
60 * 60 // 有效期 1 小时
);
console.log(`🔗 预签名下载链接(1小时有效): ${presignedUrl}`);
// 4. 下载文件
await minioClient.fGetObject(bucketName, objectName, downloadPath);
console.log(`✅ 文件 "${objectName}" 已下载到 "${downloadPath}"`);
// 5. 获取文件元数据
const stat = await minioClient.statObject(bucketName, objectName);
console.log(`📊 文件元数据: ${JSON.stringify(stat, null, 2)}`);
// 6. 列出存储桶中的所有文件
const stream = minioClient.listObjectsV2(bucketName);
stream.on('data', (obj) => console.log(`📄 桶内文件: ${obj.name}`));
stream.on('error', console.error);
// 7. 删除文件(可选,取消注释以执行)
// await minioClient.removeObject(bucketName, objectName);
// console.log(`❌ 文件 "${objectName}" 已删除`);
} catch (error) {
console.error('❌ 操作失败:', error);
}
}
// 执行示例
runExample();
- 存储桶操作
// 检查桶是否存在 await minioClient.bucketExists(bucketName); // 创建桶(带区域参数) await minioClient.makeBucket(bucketName, 'us-east-1'); // 列出所有桶 const buckets = await minioClient.listBuckets();
- 文件操作
// 上传文件 await minioClient.fPutObject(bucketName, objectName, localFilePath); // 下载文件 await minioClient.fGetObject(bucketName, objectName, downloadPath); // 删除文件 await minioClient.removeObject(bucketName, objectName); // 获取文件流(用于流式处理) const stream = await minioClient.getObject(bucketName, objectName); stream.pipe(process.stdout); // 输出到控制台
- 预签名 URL
// 生成只读 URL(有效期 1 小时) const readUrl = await minioClient.presignedGetObject(bucketName, objectName, 3600); // 生成可写 URL(用于客户端直接上传) const uploadUrl = await minioClient.presignedPutObject(bucketName, 'new-file.txt', 3600);
- 错误处理
MinIO SDK 会抛出详细的错误信息,建议在生产环境中添加完善的错误处理:
try {
await minioClient.makeBucket(bucketName);
} catch (err) {
if (err.code === 'BucketAlreadyOwnedByYou') {
console.log('桶已存在,无需创建');
} else {
throw err;
}
}
MinIO Client(mc)
MinIO Client(mc)是一个强大的命令行工具,用于管理和操作 MinIO 服务器,也兼容 Amazon S3 服务。以下是安装和使用 mc 的详细示例:
安装 MinIO Client(mc)
macOS/Linux: 使用 Homebrew(macOS):
# macOS(通过 Homebrew) brew install minio/stable/mc
配置 MinIO 服务器连接
首次使用前,需要添加 MinIO 服务器信息(称为 alias):
mc alias set myminio https://play.min.io ACCESSKEY SECRETKEY
- 参数说明:
myminio:自定义的服务器别名(方便后续操作)。https://play.min.io:MinIO 服务器 URL(使用公共测试服务器)。ACCESSKEY和SECRETKEY:你的访问密钥和秘密密钥。
mc alias set play https://play.min.io Q3AM3UQ867SPQQA43P2F S3K3T867SPQQA43P2F78
基本操作示例
- 创建存储桶(Bucket)
mc mb myminio/my-bucket
- 上传文件
# 上传单个文件 mc cp /path/to/local/file.txt myminio/my-bucket/ # 递归上传目录 mc cp --recursive /path/to/local/dir/ myminio/my-bucket/
- 下载文件
# 下载到当前目录 mc cp myminio/my-bucket/file.txt . # 下载到指定目录 mc cp myminio/my-bucket/file.txt /path/to/download/dir/
- 列出存储桶和对象
# 列出所有存储桶 mc ls myminio # 列出存储桶中的对象 mc ls myminio/my-bucket # 递归列出子目录 mc ls --recursive myminio/my-bucket
- 删除文件或存储桶
# 删除文件 mc rm myminio/my-bucket/file.txt # 删除空存储桶 mc rb myminio/my-bucket # 强制删除非空存储桶(递归删除所有内容) mc rb --force myminio/my-bucket
高级操作
- 生成预签名 URL(用于临时访问)
# 生成 7 天有效的下载链接 mc share download --expire=7d myminio/my-bucket/file.txt
- 设置存储桶策略(公开 / 私有)
# 设置存储桶为只读公开访问 mc policy set download myminio/my-bucket # 设置为私有访问 mc policy set private myminio/my-bucket
- 查看服务器状态
mc admin info myminio
使用示例:下载图片
假设要从 play 服务器的 my-bucket 下载 photos/pic1.jpg 到本地:
# 1. 添加服务器配置 mc alias set play https://play.min.io Q3AM3UQ867SPQQA43P2F S3K3T867SPQQA43P2F78 # 2. 创建本地目录 mkdir -p ~/downloads/photos # 3. 下载文件 mc cp play/my-bucket/photos/pic1.jpg ~/downloads/photos/