minio.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import uuid
  2. from datetime import datetime, timedelta
  3. from io import BytesIO
  4. from minio import Minio
  5. from app.config import get_settings
  6. class MinioService:
  7. _client: Minio | None = None
  8. _bucket: str = ""
  9. @staticmethod
  10. def _get_client() -> tuple[Minio, str]:
  11. if MinioService._client is None:
  12. settings = get_settings()
  13. MinioService._client = Minio(
  14. endpoint=settings.MINIO_ENDPOINT,
  15. access_key=settings.MINIO_ACCESS_KEY,
  16. secret_key=settings.MINIO_SECRET_KEY,
  17. secure=settings.MINIO_SECURE,
  18. )
  19. MinioService._bucket = settings.MINIO_BUCKET
  20. if not MinioService._client.bucket_exists(MinioService._bucket):
  21. MinioService._client.make_bucket(MinioService._bucket)
  22. return MinioService._client, MinioService._bucket
  23. @staticmethod
  24. def upload_file(file_name: str, file_data: bytes, content_type: str) -> str:
  25. client, bucket = MinioService._get_client()
  26. ext = file_name.rsplit(".", 1)[-1] if "." in file_name else "bin"
  27. date_str = datetime.now().strftime("%Y-%m-%d")
  28. object_name = f"bx/{date_str}/{uuid.uuid4().hex}.{ext}"
  29. data_stream = BytesIO(file_data)
  30. client.put_object(
  31. bucket,
  32. object_name,
  33. data_stream,
  34. length=len(file_data),
  35. content_type=content_type,
  36. part_size=10 * 1024 * 1024,
  37. )
  38. return object_name
  39. @staticmethod
  40. def download_file(file_path: str) -> bytes:
  41. client, bucket = MinioService._get_client()
  42. response = client.get_object(bucket, file_path)
  43. data = response.read()
  44. response.close()
  45. response.release_conn()
  46. return data
  47. @staticmethod
  48. def get_presigned_url(file_path: str, expires: int = 3600) -> str:
  49. client, bucket = MinioService._get_client()
  50. return client.presigned_get_object(
  51. bucket, file_path, expires=timedelta(seconds=expires)
  52. )