oss_client.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. import oss2
  2. from app.config import settings
  3. import logging
  4. logger = logging.getLogger(__name__)
  5. class OSSClient:
  6. def __init__(self):
  7. self.auth = oss2.Auth(
  8. settings.OSS_ACCESS_KEY_ID,
  9. settings.OSS_ACCESS_KEY_SECRET
  10. )
  11. self.bucket = oss2.Bucket(
  12. self.auth,
  13. settings.OSS_ENDPOINT,
  14. settings.OSS_BUCKET_NAME
  15. )
  16. self.prefix = settings.OSS_PREFIX.strip("/")
  17. self.cdn_url = settings.OSS_CDN_URL.rstrip("/")
  18. def _build_key(self, project_name: str, stage: str, commit_id: str, relative_path: str) -> str:
  19. """Build OSS object key."""
  20. return f"{self.prefix}/{project_name}/{stage}/{commit_id}/{relative_path}"
  21. def get_cdn_url(self, key: str) -> str:
  22. """Get CDN URL for the object."""
  23. return f"{self.cdn_url}/{key}"
  24. def upload(self, key: str, content: bytes) -> bool:
  25. """Upload content to OSS."""
  26. try:
  27. self.bucket.put_object(key, content)
  28. logger.info(f"Uploaded to OSS: {key}")
  29. return True
  30. except Exception as e:
  31. logger.error(f"Failed to upload to OSS: {e}")
  32. raise
  33. def download(self, key: str) -> bytes:
  34. """Download content from OSS."""
  35. try:
  36. result = self.bucket.get_object(key)
  37. return result.read()
  38. except oss2.exceptions.NoSuchKey:
  39. logger.error(f"OSS key not found: {key}")
  40. return None
  41. except Exception as e:
  42. logger.error(f"Failed to download from OSS: {e}")
  43. raise
  44. def exists(self, key: str) -> bool:
  45. """Check if object exists."""
  46. return self.bucket.object_exists(key)
  47. # Singleton instance
  48. oss_client = OSSClient() if settings.OSS_ACCESS_KEY_ID else None