转载: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/