当前位置: 首页 > news >正文

minio 对象存储

Minio 对象存储

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

1. minio 部署

minio 部署的方式主要使用的是 docker 部署的方式进行搭建

docker run -p 9000:9000 -p 9090:9090 \--name minio \-d --restart=always \-e "MINIO_ACCESS_KEY=minioadmin" \-e "MINIO_SECRET_KEY=minioadmin" \-v /mydata/minio/data:/data \minio/minio server \/data --console-address ":9090" -address ":9000"

使用 docker 的命令进行 minio 的处理;

version: '3.8'services:minio:# image: minio/minio:latest# 其他的版本:RELEASE.2025-02-07T23-21-09Zimage: minio/minio:RELEASE.2023-03-20T20-16-18Zcontainer_name: minioports:- "9000:9000"  # API 端口- "9090:9090"  # 控制台端口environment:MINIO_ROOT_USER: minioadmin  # 管理用户名MINIO_ROOT_PASSWORD: minioadmin  # 管理密码(生产环境建议修改)MINIO_VOLUMES: /dataMINIO_DEFAULT_BUCKETS: my-bucket  # 创建默认存储桶volumes:- minio-data:/data  # 使用命名卷command: server /data --console-address ":9090" --address ":9000"restart: alwayshealthcheck:test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]interval: 30stimeout: 20sretries: 3# 使用持久化存储的服务;
volumes:minio-data:driver: local

使用 docker compose 进行启动

# 不占用终端的方式进行启动
docker compose up -d

image-20250727190537198

2. minio 使用

访问启动后输出的地址 http:127.0.0.1:9000使用指定的地址访问界面创建存储桶。

在对象存储服务里面,所有的文件都是以桶的形式来组织的。简单说,可以将桶看作是目录,这个目录下有很多的文件或者文件夹,这和其它云存储服务基本一致。

  • 创建存储桶

    image-20250727191305319

  • 在界面中上传下载文件

    image-20250727191448630

  • 不同的版本可以进行存储的访问策略进行控制;

  • 常见的使用逻辑

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

3. python 使用 minio

# !/usr/bin/env python
# -*-coding:utf-8 -*-"""
@File    : example_minio.py
@Time    : 2025/7/27 19:41
@Author  : zi qing bao jian
@Version : 1.0
@Desc    : minio 对象存储服务;
"""import os
import uuid
import timefrom minio import Minio
from minio.datatypes import Bucket
from minio.error import S3Error# 配置信息
ENDPOINT = "192.168.159.129:9000"
ACCESS_KEY = "minioadmin"
SECRET_KEY = "minioadmin"
BUCKET_NAME = "my-learn"
SECURE = False
URL_EXPIRATION = 60 * 60 * 24def create_minio_client():"""创建 Minio 客户端;:return:"""return Minio(ENDPOINT, access_key=ACCESS_KEY, secret_key=SECRET_KEY, secure=SECURE)def create_bucket_exists(client, bucket_name):"""检查存储桶是否存在;"""try:if not client.bucket_exists(bucket_name):client.make_bucket(bucket_name)print("Bucket {} created.".format(bucket_name))else:print("Bucket {} already exists.".format(bucket_name))except Exception as e:print(f"Bucket {bucket_name} create fail{e}")def generate_unique_filename(origin_filename: str) -> str:"""生成唯一文件名, 避免冲突;:param origin_filename::return:"""ext = os.path.splitext(origin_filename)[1]  # 获取后缀名;return f"{uuid.uuid4().hex}{ext}"def upload_file(client, bucket_name, file_path, object_name=None) -> str | None:"""上传文件到 minio 中;:param client::param bucket_name::param file_path::param object_name::return:"""try:if not object_name:object_name = generate_unique_filename(os.path.basename(file_path))result = client.fput_object(bucket_name, object_name, file_path)print(f"文件上传成功, 文件名{object_name}, Etag={result.etag}")return result.object_nameexcept S3Error as e:print(f"文件上传失败{e}")def generate_presigned_url(client, bucket_name, origin_filename, expires=3600) -> str | None:"""生成签名的 URL, 允许临时访问私有对象;:param client::param bucket_name::param origin_filename::param expires::return:"""try:url = client.presigned_get_object(bucket_name, origin_filename)print(f"预签名URL生成成功 (有效期 {str(expires)} 秒): {url}")return urlexcept S3Error as e:print(f"生成预签名URL失败: {e}")return Nonedef upload_and_get_url(local_file_path: str) -> str | None:"""上传文件返回返回可访问的 URL;:param local_file_path::return:"""client = create_minio_client()create_bucket_exists(client, BUCKET_NAME)# 上传文件;object_name = upload_file(client, BUCKET_NAME, local_file_path)if not object_name:return Noneresult = generate_presigned_url(client, BUCKET_NAME, object_name, expires=URL_EXPIRATION)return resultif __name__ == '__main__':# create_minio_client()img_path = r"E:\手机文件\2025-06-01迁移\苏州\苏州人像\IMG20250410121922.jpg"url = upload_and_get_url(img_path)# print(url)print(url)

image-20250727202122293

继续努力,终成大器!

http://www.dtcms.com/a/300990.html

相关文章:

  • java的break能加标签,return可以加标签吗
  • 从一副蓝牙耳机里get倍思的“实用而美”
  • Python 程序设计讲义(23):循环结构——循环控制语句 break 与 continue
  • 背包DP之多重背包
  • 边缘提取算法结合深度学习的肺结节分割预测
  • 「日拱一码」040 机器学习-不同模型可解释方法
  • 【机器学习】第七章 特征工程
  • 【机器学习-3】 | 决策树与鸢尾花分类实践篇
  • 探索 Linux 调试利器:GDB 入门与实战指南
  • 在分布式的远程调用中proxy和stub角色区别
  • C++ 多线程 std::thread::get_id
  • 数独求解器与生成器(回溯算法实现)
  • Python|OpenCV-实现对颜色进行检测(22)
  • PandasAI连接LLM进行智能数据分析
  • qt常用控件-06
  • 【人工智能】【Python】各种评估指标,PR曲线,ROC曲线,过采样,欠采样(Scikit-Learn实践)
  • PAT 甲级题目讲解:1010《Radix》
  • Spring之【Bean的生命周期】
  • [AI8051U入门第十一步]W5500-服务端
  • Linux实战:从零搭建基于LNMP+NFS+DNS的WordPress博客系统
  • (10)数据结构--排序
  • 设计模式(八)结构型:桥接模式详解
  • k8s的权限
  • Python队列算法:从基础到高并发系统的核心引擎
  • Cline与Cursor深度实战指南:AI编程助手的革命性应用
  • 【Canvas与标牌】优质资产六角星标牌
  • Java面试全方位解析:从基础到AI的技术交锋
  • 力扣刷题(第一百天)
  • 【多模态】天池AFAC赛道四-智能体赋能的金融多模态报告自动化生成part1-数据获取
  • Linux之shell脚本篇(三)