oracle_oci_storage.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from collections.abc import Generator
  2. import boto3
  3. from botocore.exceptions import ClientError
  4. from configs import dify_config
  5. from extensions.storage.base_storage import BaseStorage
  6. class OracleOCIStorage(BaseStorage):
  7. """Implementation for Oracle OCI storage."""
  8. def __init__(self):
  9. super().__init__()
  10. self.bucket_name = dify_config.OCI_BUCKET_NAME
  11. self.client = boto3.client(
  12. "s3",
  13. aws_secret_access_key=dify_config.OCI_SECRET_KEY,
  14. aws_access_key_id=dify_config.OCI_ACCESS_KEY,
  15. endpoint_url=dify_config.OCI_ENDPOINT,
  16. region_name=dify_config.OCI_REGION,
  17. )
  18. def save(self, filename, data):
  19. self.client.put_object(Bucket=self.bucket_name, Key=filename, Body=data)
  20. def load_once(self, filename: str) -> bytes:
  21. try:
  22. data = self.client.get_object(Bucket=self.bucket_name, Key=filename)["Body"].read()
  23. except ClientError as ex:
  24. if ex.response["Error"]["Code"] == "NoSuchKey":
  25. raise FileNotFoundError("File not found")
  26. else:
  27. raise
  28. return data
  29. def load_stream(self, filename: str) -> Generator:
  30. try:
  31. response = self.client.get_object(Bucket=self.bucket_name, Key=filename)
  32. yield from response["Body"].iter_chunks()
  33. except ClientError as ex:
  34. if ex.response["Error"]["Code"] == "NoSuchKey":
  35. raise FileNotFoundError("File not found")
  36. else:
  37. raise
  38. def download(self, filename, target_filepath):
  39. self.client.download_file(self.bucket_name, filename, target_filepath)
  40. def exists(self, filename):
  41. try:
  42. self.client.head_object(Bucket=self.bucket_name, Key=filename)
  43. return True
  44. except:
  45. return False
  46. def delete(self, filename):
  47. self.client.delete_object(Bucket=self.bucket_name, Key=filename)