Files
ragflow_python/rag/utils/minio_conn.py

160 lines
5.1 KiB
Python
Raw Normal View History

import logging
import time
from minio import Minio
from io import BytesIO
from rag import settings
from rag.utils import singleton
@singleton
class RAGFlowMinio(object):
def __init__(self):
self.conn = None
self.__open__()
def __open__(self):
try:
if self.conn:
self.__close__()
except Exception:
pass
try:
self.conn = Minio(settings.MINIO["host"],
access_key=settings.MINIO["user"],
secret_key=settings.MINIO["password"],
secure=False
)
except Exception:
logging.exception(
"Fail to connect %s " % settings.MINIO["host"])
def __close__(self):
del self.conn
self.conn = None
def health(self):
bucket, fnm, binary = "txtxtxtxt1", "txtxtxtxt1", b"_t@@@1"
if not self.conn.bucket_exists(bucket):
self.conn.make_bucket(bucket)
r = self.conn.put_object(bucket, fnm,
BytesIO(binary),
len(binary)
)
return r
def put(self, bucket, fnm, binary):
for _ in range(3):
try:
if not self.conn.bucket_exists(bucket):
self.conn.make_bucket(bucket)
r = self.conn.put_object(bucket, fnm,
BytesIO(binary),
len(binary)
)
return r
except Exception:
logging.exception(f"Fail to put {bucket}/{fnm}:")
self.__open__()
time.sleep(1)
def rm(self, bucket, fnm):
try:
self.conn.remove_object(bucket, fnm)
except Exception:
logging.exception(f"Fail to remove {bucket}/{fnm}:")
def get(self, bucket, filename):
for _ in range(1):
try:
r = self.conn.get_object(bucket, filename)
return r.read()
except Exception:
logging.exception(f"Fail to get {bucket}/{filename}")
self.__open__()
time.sleep(1)
return
def obj_exist(self, bucket, filename):
try:
if not self.conn.bucket_exists(bucket):
return False
if self.conn.stat_object(bucket, filename):
return True
else:
return False
except Exception:
logging.exception(f"Not found: {bucket}/{filename}")
return False
def get_presigned_url(self, bucket, fnm, expires):
for _ in range(10):
try:
return self.conn.get_presigned_url("GET", bucket, fnm, expires)
except Exception:
logging.exception(f"Fail to get_presigned {bucket}/{fnm}:")
self.__open__()
time.sleep(1)
return
def list_objects(self, bucket: str, prefix: str = "", recursive: bool = True) -> list[dict]:
"""
列出存储桶中指定前缀的所有对象
:param bucket: 存储桶名称
:param prefix: 对象前缀目录路径
:param recursive: 是否递归列出
:return: 对象信息列表 [{"name": str, "size": int, "last_modified": datetime}, ...]
"""
objects = []
for attempt in range(3):
try:
# 确保存储桶存在
if not self.conn.bucket_exists(bucket):
logging.warning(f"存储桶不存在: {bucket}")
return []
# 列出对象
result = self.conn.list_objects(bucket, prefix=prefix, recursive=recursive)
# 收集对象信息
for obj in result:
objects.append({
"name": obj.object_name,
"size": obj.size,
"last_modified": obj.last_modified,
"etag": obj.etag,
"content_type": obj.content_type
})
return objects
except S3Error as e:
if e.code == "NoSuchBucket":
logging.warning(f"存储桶不存在: {bucket}")
return []
logging.exception(f"列出对象时发生S3错误: {e}")
except Exception as e:
logging.exception(f"列出对象失败 (尝试 {attempt + 1}/3): {e}")
# 重连并等待
self.__open__()
time.sleep(1)
return []
MINIO = RAGFlowMinio()
if __name__ == "__main__":
conn = RAGFlowMinio()
fnm = "/opt/home/kevinhu/docgpt/upload/13/11-408.jpg"
from PIL import Image
img = Image.open(fnm)
buff = BytesIO()
img.save(buff, format='JPEG')
print(conn.put("test", "11-408.jpg", buff.getvalue()))
bts = conn.get("test", "11-408.jpg")
img = Image.open(BytesIO(bts))
img.save("test.jpg")