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-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)

繼續努力,終成大器!

浙公網安備 33010602011771號