local_fs_storage.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import os
  2. import shutil
  3. from collections.abc import Generator
  4. from pathlib import Path
  5. from flask import current_app
  6. from configs import dify_config
  7. from extensions.storage.base_storage import BaseStorage
  8. class LocalFsStorage(BaseStorage):
  9. """Implementation for local filesystem storage."""
  10. def __init__(self):
  11. super().__init__()
  12. folder = dify_config.STORAGE_LOCAL_PATH
  13. if not os.path.isabs(folder):
  14. folder = os.path.join(current_app.root_path, folder)
  15. self.folder = folder
  16. def save(self, filename, data):
  17. if not self.folder or self.folder.endswith("/"):
  18. filename = self.folder + filename
  19. else:
  20. filename = self.folder + "/" + filename
  21. folder = os.path.dirname(filename)
  22. os.makedirs(folder, exist_ok=True)
  23. Path(os.path.join(os.getcwd(), filename)).write_bytes(data)
  24. def load_once(self, filename: str) -> bytes:
  25. if not self.folder or self.folder.endswith("/"):
  26. filename = self.folder + filename
  27. else:
  28. filename = self.folder + "/" + filename
  29. if not os.path.exists(filename):
  30. raise FileNotFoundError("File not found")
  31. data = Path(filename).read_bytes()
  32. return data
  33. def load_stream(self, filename: str) -> Generator:
  34. def generate(filename: str = filename) -> Generator:
  35. if not self.folder or self.folder.endswith("/"):
  36. filename = self.folder + filename
  37. else:
  38. filename = self.folder + "/" + filename
  39. if not os.path.exists(filename):
  40. raise FileNotFoundError("File not found")
  41. with open(filename, "rb") as f:
  42. while chunk := f.read(4096): # Read in chunks of 4KB
  43. yield chunk
  44. return generate()
  45. def download(self, filename, target_filepath):
  46. if not self.folder or self.folder.endswith("/"):
  47. filename = self.folder + filename
  48. else:
  49. filename = self.folder + "/" + filename
  50. if not os.path.exists(filename):
  51. raise FileNotFoundError("File not found")
  52. shutil.copyfile(filename, target_filepath)
  53. def exists(self, filename):
  54. if not self.folder or self.folder.endswith("/"):
  55. filename = self.folder + filename
  56. else:
  57. filename = self.folder + "/" + filename
  58. return os.path.exists(filename)
  59. def delete(self, filename):
  60. if not self.folder or self.folder.endswith("/"):
  61. filename = self.folder + filename
  62. else:
  63. filename = self.folder + "/" + filename
  64. if os.path.exists(filename):
  65. os.remove(filename)