minio 个人开发首选的图床

1,735 阅读3分钟

前言

大家好,我是你不会困,写代码就不会困,今天分享的是minio 个人开发首选的图床

什么是minio

Minio 是一个开源的对象存储服务器,它兼容 Amazon S3 云存储服务的 API。Minio 可以用于搭建私有云存储解决方案,使用户能够像使用 Amazon S3 一样存储和检索数据,同时提供高可用性、扩展性和安全性。

一些 Minio 的特点包括:

  1. 开源性:Minio 是开源的,可以免费使用和定制,适合个人、企业和组织使用。
  2. 兼容性:Minio 兼容 Amazon S3 的 API,因此现有支持 S3 API 的应用程序可以很容易地切换到使用 Minio。
  3. 分布式架构:Minio 可以在多个节点上部署,实现分布式存储和负载均衡,从而提供高可用性和扩展性。
  4. 安全性:Minio 支持数据加密、访问控制和策略管理,可以帮助用户保护存储在其中的数据安全。
  5. 轻量级: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

image.png

启动成功,访问http://localhost:9001

image.png 登录进去添加一个存储桶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;

接口文档调用接口

image.png