Refactor code structure for improved readability and maintainability
This commit is contained in:
122
app/services/minio.py
Normal file
122
app/services/minio.py
Normal file
@@ -0,0 +1,122 @@
|
||||
"""MinIO 文件存储服务"""
|
||||
|
||||
import io
|
||||
from minio import Minio
|
||||
from minio.error import S3Error
|
||||
from app.core.config import settings
|
||||
from app.utils.logger import logger
|
||||
|
||||
|
||||
class MinioService:
|
||||
"""MinIO 文件存储服务"""
|
||||
|
||||
def __init__(self):
|
||||
self.client = Minio(
|
||||
settings.minio_endpoint,
|
||||
access_key=settings.minio_access_key,
|
||||
secret_key=settings.minio_secret_key,
|
||||
secure=settings.minio_secure,
|
||||
)
|
||||
self.bucket = settings.minio_bucket
|
||||
self._ensure_bucket()
|
||||
|
||||
def _ensure_bucket(self):
|
||||
"""确保存储桶存在"""
|
||||
try:
|
||||
if not self.client.bucket_exists(self.bucket):
|
||||
self.client.make_bucket(self.bucket)
|
||||
logger.info(f"Created MinIO bucket: {self.bucket}")
|
||||
except S3Error as e:
|
||||
logger.error(f"MinIO bucket check failed: {e}")
|
||||
|
||||
def upload_file(
|
||||
self,
|
||||
object_name: str,
|
||||
file_data: bytes,
|
||||
content_type: str = "application/octet-stream",
|
||||
) -> str:
|
||||
"""
|
||||
上传文件到 MinIO
|
||||
|
||||
Args:
|
||||
object_name: 对象名称(文件路径)
|
||||
file_data: 文件二进制数据
|
||||
content_type: 文件类型
|
||||
|
||||
Returns:
|
||||
文件的 MinIO URL
|
||||
"""
|
||||
try:
|
||||
data_stream = io.BytesIO(file_data)
|
||||
self.client.put_object(
|
||||
self.bucket,
|
||||
object_name,
|
||||
data_stream,
|
||||
length=len(file_data),
|
||||
content_type=content_type,
|
||||
)
|
||||
url = f"{settings.minio_endpoint}/{self.bucket}/{object_name}"
|
||||
logger.info(f"Uploaded file to MinIO: {object_name}")
|
||||
return url
|
||||
except S3Error as e:
|
||||
logger.error(f"MinIO upload failed: {e}")
|
||||
raise
|
||||
|
||||
def get_file(self, object_name: str) -> bytes:
|
||||
"""
|
||||
从 MinIO 获取文件
|
||||
|
||||
Args:
|
||||
object_name: 对象名称
|
||||
|
||||
Returns:
|
||||
文件二进制数据
|
||||
"""
|
||||
try:
|
||||
response = self.client.get_object(self.bucket, object_name)
|
||||
data = response.read()
|
||||
response.close()
|
||||
response.release_conn()
|
||||
return data
|
||||
except S3Error as e:
|
||||
logger.error(f"MinIO get file failed: {e}")
|
||||
raise
|
||||
|
||||
def delete_file(self, object_name: str) -> bool:
|
||||
"""
|
||||
删除 MinIO 中的文件
|
||||
|
||||
Args:
|
||||
object_name: 对象名称
|
||||
|
||||
Returns:
|
||||
是否成功删除
|
||||
"""
|
||||
try:
|
||||
self.client.remove_object(self.bucket, object_name)
|
||||
logger.info(f"Deleted file from MinIO: {object_name}")
|
||||
return True
|
||||
except S3Error as e:
|
||||
logger.error(f"MinIO delete failed: {e}")
|
||||
return False
|
||||
|
||||
def list_files(self, prefix: str = "") -> list[str]:
|
||||
"""
|
||||
列出 MinIO 中的文件
|
||||
|
||||
Args:
|
||||
prefix: 文件前缀过滤
|
||||
|
||||
Returns:
|
||||
文件名列表
|
||||
"""
|
||||
try:
|
||||
objects = self.client.list_objects(self.bucket, prefix=prefix)
|
||||
return [obj.object_name for obj in objects]
|
||||
except S3Error as e:
|
||||
logger.error(f"MinIO list files failed: {e}")
|
||||
return []
|
||||
|
||||
|
||||
# 单例
|
||||
minio_service = MinioService()
|
||||
Reference in New Issue
Block a user