前言
大家好,我是你不会困,写代码就不会困,今天分享的是minio 个人开发首选的图床
什么是minio
Minio 是一个开源的对象存储服务器,它兼容 Amazon S3 云存储服务的 API。Minio 可以用于搭建私有云存储解决方案,使用户能够像使用 Amazon S3 一样存储和检索数据,同时提供高可用性、扩展性和安全性。
一些 Minio 的特点包括:
- 开源性:Minio 是开源的,可以免费使用和定制,适合个人、企业和组织使用。
- 兼容性:Minio 兼容 Amazon S3 的 API,因此现有支持 S3 API 的应用程序可以很容易地切换到使用 Minio。
- 分布式架构:Minio 可以在多个节点上部署,实现分布式存储和负载均衡,从而提供高可用性和扩展性。
- 安全性:Minio 支持数据加密、访问控制和策略管理,可以帮助用户保护存储在其中的数据安全。
- 轻量级:Minio 是一个轻量级的对象存储服务器,易于部署和管理,适用于各种规模的应用场景。
通过使用 Minio,用户可以搭建自己的对象存储解决方案,存储大量数据并实现对数据的访问和管理。Minio 也提供了丰富的客户端 SDK 和工具,方便开发人员与 Minio 服务进行集成和交互。
如何在 docker 上创建一个 Minio 服务
编写docker-compose.yml文件,这里链接minio是9000端口,访问他的管理后台是9001,不要掉坑里了
version: "3.9"
services:
minio:
image: minio/minio
volumes:
- data:/data
- config:/root/.minio
ports:
- "9000:9000"
- "9001:9001"
environment:
MINIO_ROOT_USER: moment
MINIO_ROOT_PASSWORD: moment666
command: server /data --console-address ":9001"
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
interval: 30s
timeout: 20s
retries: 3
volumes:
data:
config:
在这个示例中:
image: 指定要使用的 Minio 镜像。container_name: 指定容器的名称。ports: 将 Minio 服务的 9000 端口映射到宿主机的 9000 端口,这样就可以通过http://localhost:9000访问 Minio Web 界面。environment: 设置环境变量MINIO_ROOT_USER和MINIO_ROOT_PASSWORD,用于设置 Minio 的管理员账号和密码。volumes: 将 Minio 的数据目录挂载到宿主机上,以确保数据持久化。command: 指定启动 Minio 服务时的命令,这里是指定使用/data目录来存储数据。
启动
在文件的目录下启动docker容器 docker-compose up -d
启动成功,访问http://localhost:9001
登录进去添加一个存储桶pic
使用node的express来链接对应的minio
1、安装minio
pnpm i minio
2、express的使用
const express = require('express');
const Minio = require('minio');
const multer = require('multer');
const router = express.Router();
const minioClient = new Minio.Client({
endPoint: '192.168.0.77',
port: 9000,
useSSL: false,
accessKey: 'moment',
secretKey: 'moment666'
});
// 配置 multer 中间件
const upload = multer({ dest: 'uploads/' });
/**
* @swagger
* /minio/upload:
* post:
* tags:
* - File
* description: 上传文件
* produces: multipart/form-data
* requestBody:
* content:
* multipart/form-data:
* schema:
* type: object
* properties:
* file:
* type: string
* format: binary
* responses:
* 200:
* description: Successfully created
*/
router.post('/upload', upload.single('file'), (req, res) => {
const file = req.file;
const bucketName = 'pic';
const objectName = file.originalname;
// 设置文件的 Content-Type 为 application/octet-stream
const metaData = {
'Content-Type': 'application/octet-stream'
};
minioClient.fPutObject(bucketName, objectName, file.path, metaData, function (err, etag) {
if (err) {
return res.status(500).json({ error: err });
}
res.status(200).json({ message: 'localhost:9000/pic/' + objectName });
});
});
module.exports = router;
接口文档调用接口