baidu_storage.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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 flask import Flask
  8. from extensions.storage.base_storage import BaseStorage
  9. class BaiduStorage(BaseStorage):
  10. """Implementation for baidu obs storage."""
  11. def __init__(self, app: Flask):
  12. super().__init__(app)
  13. app_config = self.app.config
  14. self.bucket_name = app_config.get("BAIDU_OBS_BUCKET_NAME")
  15. client_config = BceClientConfiguration(
  16. credentials=BceCredentials(
  17. access_key_id=app_config.get("BAIDU_OBS_ACCESS_KEY"),
  18. secret_access_key=app_config.get("BAIDU_OBS_SECRET_KEY"),
  19. ),
  20. endpoint=app_config.get("BAIDU_OBS_ENDPOINT"),
  21. )
  22. self.client = BosClient(config=client_config)
  23. def save(self, filename, data):
  24. md5 = hashlib.md5()
  25. md5.update(data)
  26. content_md5 = base64.standard_b64encode(md5.digest())
  27. self.client.put_object(
  28. bucket_name=self.bucket_name, key=filename, data=data, content_length=len(data), content_md5=content_md5
  29. )
  30. def load_once(self, filename: str) -> bytes:
  31. response = self.client.get_object(bucket_name=self.bucket_name, key=filename)
  32. return response.data.read()
  33. def load_stream(self, filename: str) -> Generator:
  34. def generate(filename: str = filename) -> Generator:
  35. response = self.client.get_object(bucket_name=self.bucket_name, key=filename).data
  36. while chunk := response.read(4096):
  37. yield chunk
  38. return generate()
  39. def download(self, filename, target_filepath):
  40. self.client.get_object_to_file(bucket_name=self.bucket_name, key=filename, file_name=target_filepath)
  41. def exists(self, filename):
  42. res = self.client.get_object_meta_data(bucket_name=self.bucket_name, key=filename)
  43. if res is None:
  44. return False
  45. return True
  46. def delete(self, filename):
  47. self.client.delete_object(bucket_name=self.bucket_name, key=filename)