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-09Z
- image: minio/minio:RELEASE.2023-03-20T20-16-18Z
- container_name: minio
- ports:
- - "9000:9000" # API 端口
- - "9090:9090" # 控制台端口
- environment:
- MINIO_ROOT_USER: minioadmin # 管理用户名
- MINIO_ROOT_PASSWORD: minioadmin # 管理密码(生产环境建议修改)
- MINIO_VOLUMES: /data
- MINIO_DEFAULT_BUCKETS: my-bucket # 创建默认存储桶
- volumes:
- - minio-data:/data # 使用命名卷
- command: server /data --console-address ":9090" --address ":9000"
- restart: always
- healthcheck:
- test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
- interval: 30s
- timeout: 20s
- retries: 3
- # 使用持久化存储的服务;
- volumes:
- minio-data:
- driver: local
复制代码 使用 docker compose 进行启动- # 不占用终端的方式进行启动
- docker compose up -d
复制代码
2. minio 使用
访问启动后输出的地址 http:127.0.0.1:9000使用指定的地址访问界面创建存储桶。
在对象存储服务里面,所有的文件都是以桶的形式来组织的。简单说,可以将桶看作是目录,这个目录下有很多的文件或者文件夹,这和其它云存储服务基本一致。
- 创建存储桶
- 在界面中上传下载文件
- 不同的版本可以进行存储的访问策略进行控制;
- 常见的使用逻辑
- 上传文件:首先,你通过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 time
- from 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 * 24
- def 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_name
- except 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 url
- except S3Error as e:
- print(f"生成预签名URL失败: {e}")
- return None
- def 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 None
- result = generate_presigned_url(client, BUCKET_NAME, object_name, expires=URL_EXPIRATION)
- return result
- if __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)
复制代码
继续努力,终成大器!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |