aliyun_oss_storage.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. from collections.abc import Generator
  2. import oss2 as aliyun_s3
  3. from configs import dify_config
  4. from extensions.storage.base_storage import BaseStorage
  5. class AliyunOssStorage(BaseStorage):
  6. """Implementation for Aliyun OSS storage."""
  7. def __init__(self):
  8. super().__init__()
  9. self.bucket_name = dify_config.ALIYUN_OSS_BUCKET_NAME
  10. self.folder = dify_config.ALIYUN_OSS_PATH
  11. oss_auth_method = aliyun_s3.Auth
  12. region = None
  13. if dify_config.ALIYUN_OSS_AUTH_VERSION == "v4":
  14. oss_auth_method = aliyun_s3.AuthV4
  15. region = dify_config.ALIYUN_OSS_REGION
  16. oss_auth = oss_auth_method(dify_config.ALIYUN_OSS_ACCESS_KEY, dify_config.ALIYUN_OSS_SECRET_KEY)
  17. self.client = aliyun_s3.Bucket(
  18. oss_auth,
  19. dify_config.ALIYUN_OSS_ENDPOINT,
  20. self.bucket_name,
  21. connect_timeout=30,
  22. region=region,
  23. )
  24. def save(self, filename, data):
  25. self.client.put_object(self.__wrapper_folder_filename(filename), data)
  26. def load_once(self, filename: str) -> bytes:
  27. obj = self.client.get_object(self.__wrapper_folder_filename(filename))
  28. data = obj.read()
  29. return data
  30. def load_stream(self, filename: str) -> Generator:
  31. def generate(filename: str = filename) -> Generator:
  32. obj = self.client.get_object(self.__wrapper_folder_filename(filename))
  33. while chunk := obj.read(4096):
  34. yield chunk
  35. return generate()
  36. def download(self, filename, target_filepath):
  37. self.client.get_object_to_file(self.__wrapper_folder_filename(filename), target_filepath)
  38. def exists(self, filename):
  39. return self.client.object_exists(self.__wrapper_folder_filename(filename))
  40. def delete(self, filename):
  41. self.client.delete_object(self.__wrapper_folder_filename(filename))
  42. def __wrapper_folder_filename(self, filename) -> str:
  43. if self.folder:
  44. if self.folder.endswith("/"):
  45. filename = self.folder + filename
  46. else:
  47. filename = self.folder + "/" + filename
  48. return filename