找回密码
 立即注册
首页 业界区 安全 minio 对象存储服务

minio 对象存储服务

喙审 4 小时前
Minio 对象存储

梗概:本篇文章主要介绍 minio 对象存储服务的使用;Minio是一个简单易用的云存储服务,就像是一个放在网络上的大文件柜。想象一下,你有一间放满了各种文件的房间,有时候你需要把这些文件分享给朋友或者在不同地方访问它们。Minio就是帮你做到这一点的工具,它让你可以轻松地把文件上传到互联网上,这样无论你在哪里,只要有网络,就能访问或分享这些文件。
1. minio 部署

minio 部署的方式主要使用的是 docker 部署的方式进行搭建
  1. docker run -p 9000:9000 -p 9090:9090 \
  2. --name minio \
  3. -d --restart=always \
  4. -e "MINIO_ACCESS_KEY=minioadmin" \
  5. -e "MINIO_SECRET_KEY=minioadmin" \
  6. -v /mydata/minio/data:/data \
  7. minio/minio server \
  8. /data --console-address ":9090" -address ":9000"
复制代码
使用 docker 的命令进行 minio 的处理;
  1. version: '3.8'
  2. services:
  3.   minio:
  4.     # image: minio/minio:latest
  5.     # 其他的版本:RELEASE.2025-02-07T23-21-09Z
  6.     image: minio/minio:RELEASE.2023-03-20T20-16-18Z
  7.     container_name: minio
  8.     ports:
  9.       - "9000:9000"  # API 端口
  10.       - "9090:9090"  # 控制台端口
  11.     environment:
  12.       MINIO_ROOT_USER: minioadmin  # 管理用户名
  13.       MINIO_ROOT_PASSWORD: minioadmin  # 管理密码(生产环境建议修改)
  14.       MINIO_VOLUMES: /data
  15.       MINIO_DEFAULT_BUCKETS: my-bucket  # 创建默认存储桶
  16.     volumes:
  17.       - minio-data:/data  # 使用命名卷
  18.     command: server /data --console-address ":9090" --address ":9000"
  19.     restart: always
  20.     healthcheck:
  21.       test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  22.       interval: 30s
  23.       timeout: 20s
  24.       retries: 3
  25. # 使用持久化存储的服务;
  26. volumes:
  27.   minio-data:
  28.     driver: local
复制代码
使用 docker compose 进行启动
  1. # 不占用终端的方式进行启动
  2. docker compose up -d
复制代码
1.png

2. minio 使用

访问启动后输出的地址 http:127.0.0.1:9000使用指定的地址访问界面创建存储桶。
在对象存储服务里面,所有的文件都是以桶的形式来组织的。简单说,可以将桶看作是目录,这个目录下有很多的文件或者文件夹,这和其它云存储服务基本一致。

  • 创建存储桶
    2.png

  • 在界面中上传下载文件
    3.png

  • 不同的版本可以进行存储的访问策略进行控制;
  • 常见的使用逻辑

    • 上传文件:首先,你通过Minio提供的接口或者工具,把视频或图片上传到Minio的服务器上。上传时,你可以设置一些额外的信息,告诉Minio这些文件是可以被公开访问的。
    • 生成链接:当你要在网站上展示这些文件时,Minio能生成一个特殊的网址(我们叫做对象URL)。这个链接直接指向存储在Minio中的视频或图片。关键在于,这个链接可以设置一个有效期,过了时间就失效,保证安全性。
    • 前端显示:网站的前端代码(就是浏览器能看到的部分)会用这个链接去请求Minio服务器上的视频或图片。当浏览器收到这些文件时,如果它们是图片,就会直接显示在页面上;如果是视频,则会在页面上嵌入一个播放器让用户观看。
    • 下载功能:对于下载来说,其实也很简单。因为前端已经有了这个文件的直接链接,用户点击“下载”按钮时,浏览器就会使用这个链接开始下载文件到用户的电脑上,就像平时在网上下载东西一样。

3. python 使用 minio
  1. # !/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. """
  4. @File    : example_minio.py
  5. @Time    : 2025/7/27 19:41
  6. @Author  : zi qing bao jian
  7. @Version : 1.0
  8. @Desc    : minio 对象存储服务;
  9. """
  10. import os
  11. import uuid
  12. import time
  13. from minio import Minio
  14. from minio.datatypes import Bucket
  15. from minio.error import S3Error
  16. # 配置信息
  17. ENDPOINT = "192.168.159.129:9000"
  18. ACCESS_KEY = "minioadmin"
  19. SECRET_KEY = "minioadmin"
  20. BUCKET_NAME = "my-learn"
  21. SECURE = False
  22. URL_EXPIRATION = 60 * 60 * 24
  23. def create_minio_client():
  24.     """
  25.     创建 Minio 客户端;
  26.     :return:
  27.     """
  28.     return Minio(ENDPOINT, access_key=ACCESS_KEY, secret_key=SECRET_KEY, secure=SECURE)
  29. def create_bucket_exists(client, bucket_name):
  30.     """检查存储桶是否存在;
  31.     """
  32.     try:
  33.         if not client.bucket_exists(bucket_name):
  34.             client.make_bucket(bucket_name)
  35.             print("Bucket {} created.".format(bucket_name))
  36.         else:
  37.             print("Bucket {} already exists.".format(bucket_name))
  38.     except Exception as e:
  39.         print(f"Bucket {bucket_name} create fail{e}")
  40. def generate_unique_filename(origin_filename: str) -> str:
  41.     """
  42.     生成唯一文件名, 避免冲突;
  43.     :param origin_filename:
  44.     :return:
  45.     """
  46.     ext = os.path.splitext(origin_filename)[1]  # 获取后缀名;
  47.     return f"{uuid.uuid4().hex}{ext}"
  48. def upload_file(client, bucket_name, file_path, object_name=None) -> str | None:
  49.     """
  50.     上传文件到 minio 中;
  51.     :param client:
  52.     :param bucket_name:
  53.     :param file_path:
  54.     :param object_name:
  55.     :return:
  56.     """
  57.     try:
  58.         if not object_name:
  59.             object_name = generate_unique_filename(os.path.basename(file_path))
  60.             result = client.fput_object(bucket_name, object_name, file_path)
  61.             print(f"文件上传成功, 文件名{object_name}, Etag={result.etag}")
  62.             return result.object_name
  63.     except S3Error as e:
  64.         print(f"文件上传失败{e}")
  65. def generate_presigned_url(client, bucket_name, origin_filename, expires=3600) -> str | None:
  66.     """
  67.     生成签名的 URL, 允许临时访问私有对象;
  68.     :param client:
  69.     :param bucket_name:
  70.     :param origin_filename:
  71.     :param expires:
  72.     :return:
  73.     """
  74.     try:
  75.         url = client.presigned_get_object(bucket_name, origin_filename)
  76.         print(f"预签名URL生成成功 (有效期 {str(expires)} 秒): {url}")
  77.         return url
  78.     except S3Error as e:
  79.         print(f"生成预签名URL失败: {e}")
  80.         return None
  81. def upload_and_get_url(local_file_path: str) -> str | None:
  82.     """
  83.     上传文件返回返回可访问的 URL;
  84.     :param local_file_path:
  85.     :return:
  86.     """
  87.     client = create_minio_client()
  88.     create_bucket_exists(client, BUCKET_NAME)
  89.     # 上传文件;
  90.     object_name = upload_file(client, BUCKET_NAME, local_file_path)
  91.     if not object_name:
  92.         return None
  93.     result = generate_presigned_url(client, BUCKET_NAME, object_name, expires=URL_EXPIRATION)
  94.     return result
  95. if __name__ == '__main__':
  96.     # create_minio_client()
  97.     img_path = r"E:\手机文件\2025-06-01迁移\苏州\苏州人像\IMG20250410121922.jpg"
  98.     url = upload_and_get_url(img_path)
  99.     # print(url)
  100.     print(url)
复制代码
4.png

继续努力,终成大器!

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册