RAGflow/management/server/get_minio_image_url.py

161 lines
4.9 KiB
Python

import os
import sys
import argparse
from minio import Minio
from dotenv import load_dotenv
# 加载环境变量
load_dotenv("../../docker/.env")
def is_running_in_docker():
# 检查是否存在/.dockerenv文件
docker_env = os.path.exists('/.dockerenv')
# 或者检查cgroup中是否包含docker字符串
try:
with open('/proc/self/cgroup', 'r') as f:
return docker_env or 'docker' in f.read()
except:
return docker_env
MINIO_HOST = 'host.docker.internal' if is_running_in_docker() else 'localhost'
# MinIO连接配置
MINIO_CONFIG = {
"endpoint": f"{MINIO_HOST}:{os.getenv('MINIO_PORT', '9000')}",
"access_key": os.getenv("MINIO_USER", "rag_flow"),
"secret_key": os.getenv("MINIO_PASSWORD", "infini_rag_flow"),
"secure": False
}
def get_minio_client():
"""创建MinIO客户端"""
return Minio(
endpoint=MINIO_CONFIG["endpoint"],
access_key=MINIO_CONFIG["access_key"],
secret_key=MINIO_CONFIG["secret_key"],
secure=MINIO_CONFIG["secure"]
)
def get_image_url(kb_id, image_key):
"""获取图片的公共访问URL
Args:
kb_id: 知识库ID
image_key: 图片在MinIO中的键
Returns:
图片的公共访问URL
"""
try:
minio_client = get_minio_client()
# 检查桶和对象是否存在
if not minio_client.bucket_exists(kb_id):
print(f"[ERROR] 存储桶不存在: {kb_id}")
return None
try:
minio_client.stat_object(kb_id, image_key)
except Exception as e:
print(f"[ERROR] 对象不存在: {kb_id}/{image_key}, 错误: {str(e)}")
return None
# 获取MinIO服务器配置
minio_endpoint = MINIO_CONFIG["endpoint"]
use_ssl = MINIO_CONFIG["secure"]
# 构建URL
protocol = "https" if use_ssl else "http"
url = f"{protocol}://{minio_endpoint}/{kb_id}/{image_key}"
return url
except Exception as e:
print(f"[ERROR] 获取图片URL失败: {str(e)}")
return None
def list_bucket_images(kb_id, prefix="images/"):
"""列出知识库中的所有图片
Args:
kb_id: 知识库ID
prefix: 图片前缀,默认为"images/"
Returns:
图片列表
"""
try:
minio_client = get_minio_client()
# 检查桶是否存在
if not minio_client.bucket_exists(kb_id):
print(f"[ERROR] 存储桶不存在: {kb_id}")
return []
# 列出桶中的所有对象
objects = minio_client.list_objects(kb_id, prefix=prefix, recursive=True)
image_list = []
for obj in objects:
image_list.append(obj.object_name)
return image_list
except Exception as e:
print(f"[ERROR] 列出图片失败: {str(e)}")
return []
def main():
parser = argparse.ArgumentParser(description="查询MinIO中图片的外链")
parser.add_argument("--kb_id", help="知识库ID", required=False)
parser.add_argument("--image_key", help="图片在MinIO中的键", required=False)
parser.add_argument("--list", action="store_true", help="列出知识库中的所有图片")
parser.add_argument("--list_buckets", action="store_true", help="列出所有存储桶")
args = parser.parse_args()
# 列出所有存储桶
if args.list_buckets:
try:
minio_client = get_minio_client()
buckets = minio_client.list_buckets()
print("可用的存储桶列表:")
for bucket in buckets:
print(f" - {bucket.name}")
return
except Exception as e:
print(f"[ERROR] 列出存储桶失败: {str(e)}")
return
# 检查必要参数
if not args.kb_id:
print("[ERROR] 请提供知识库ID (--kb_id)")
parser.print_help()
return
# 列出知识库中的所有图片
if args.list:
images = list_bucket_images(args.kb_id)
if images:
print(f"知识库 {args.kb_id} 中的图片列表:")
for i, image in enumerate(images, 1):
url = get_image_url(args.kb_id, image)
print(f" {i}. {image}")
print(f" URL: {url}")
else:
print(f"知识库 {args.kb_id} 中没有图片")
return
# 获取单个图片的URL
if not args.image_key:
print("[ERROR] 请提供图片键 (--image_key) 或使用 --list 列出所有图片")
parser.print_help()
return
url = get_image_url(args.kb_id, args.image_key)
if url:
print(f"图片 {args.kb_id}/{args.image_key} 的URL:")
print(url)
else:
print(f"无法获取图片 {args.kb_id}/{args.image_key} 的URL")
if __name__ == "__main__":
main()