baidu_obs_storage.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. import base64
  2. import hashlib
  3. from collections.abc import Generator
  4. from baidubce.auth.bce_credentials import BceCredentials
  5. from baidubce.bce_client_configuration import BceClientConfiguration
  6. from baidubce.services.bos.bos_client import BosClient
  7. from configs import dify_config
  8. from extensions.storage.base_storage import BaseStorage
  9. class BaiduObsStorage(BaseStorage):
  10. """Implementation for Baidu OBS storage."""
  11. def __init__(self):
  12. super().__init__()
  13. self.bucket_name = dify_config.BAIDU_OBS_BUCKET_NAME
  14. client_config = BceClientConfiguration(
  15. credentials=BceCredentials(
  16. access_key_id=dify_config.BAIDU_OBS_ACCESS_KEY,
  17. secret_access_key=dify_config.BAIDU_OBS_SECRET_KEY,
  18. ),
  19. endpoint=dify_config.BAIDU_OBS_ENDPOINT,
  20. )
  21. self.client = BosClient(config=client_config)
  22. def save(self, filename, data):
  23. md5 = hashlib.md5()
  24. md5.update(data)
  25. content_md5 = base64.standard_b64encode(md5.digest())
  26. self.client.put_object(
  27. bucket_name=self.bucket_name, key=filename, data=data, content_length=len(data), content_md5=content_md5
  28. )
  29. def load_once(self, filename: str) -> bytes:
  30. response = self.client.get_object(bucket_name=self.bucket_name, key=filename)
  31. return response.data.read()
  32. def load_stream(self, filename: str) -> Generator:
  33. response = self.client.get_object(bucket_name=self.bucket_name, key=filename).data
  34. while chunk := response.read(4096):
  35. yield chunk
  36. def download(self, filename, target_filepath):
  37. self.client.get_object_to_file(bucket_name=self.bucket_name, key=filename, file_name=target_filepath)
  38. def exists(self, filename):
  39. res = self.client.get_object_meta_data(bucket_name=self.bucket_name, key=filename)
  40. if res is None:
  41. return False
  42. return True
  43. def delete(self, filename):
  44. self.client.delete_object(bucket_name=self.bucket_name, key=filename)