From 0a923bced96fbd7b14fa1c51563447a253e474ad Mon Sep 17 00:00:00 2001 From: jxxghp Date: Sat, 23 Nov 2024 12:29:34 +0800 Subject: [PATCH] fix storage --- app/modules/filemanager/storages/__init__.py | 2 ++ app/modules/filemanager/storages/alipan.py | 30 +++++++++++++++++++- app/modules/filemanager/storages/alist.py | 10 +++++-- app/modules/filemanager/storages/local.py | 2 ++ app/modules/filemanager/storages/rclone.py | 15 +++++----- app/modules/filemanager/storages/u115.py | 3 ++ 6 files changed, 50 insertions(+), 12 deletions(-) diff --git a/app/modules/filemanager/storages/__init__.py b/app/modules/filemanager/storages/__init__.py index 635217e8..2ffa561c 100644 --- a/app/modules/filemanager/storages/__init__.py +++ b/app/modules/filemanager/storages/__init__.py @@ -79,6 +79,8 @@ class StorageBase(metaclass=ABCMeta): def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]: """ 创建目录 + :param fileitem: 父目录 + :param name: 目录名 """ pass diff --git a/app/modules/filemanager/storages/alipan.py b/app/modules/filemanager/storages/alipan.py index 2cf08c8b..450561e2 100644 --- a/app/modules/filemanager/storages/alipan.py +++ b/app/modules/filemanager/storages/alipan.py @@ -291,6 +291,8 @@ class AliPan(StorageBase, metaclass=Singleton): def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]: """ 创建目录 + :param fileitem: 父目录 + :param name: 目录名 """ if not self.aligo: return None @@ -305,14 +307,40 @@ class AliPan(StorageBase, metaclass=Singleton): """ 根据文件路程获取目录,不存在则创建 """ + + def __find_dir(_fileitem: schemas.FileItem, _name: str) -> Optional[schemas.FileItem]: + """ + 查找下级目录中匹配名称的目录 + """ + for sub_folder in self.list(_fileitem): + if sub_folder.type != "dir": + continue + if sub_folder.name == _name: + return sub_folder + return None + if not self.aligo: return None item = self.aligo.get_folder_by_path(path=str(path), create_folder=True) if item: + # 已存在 if isinstance(item, CreateFileResponse): item = self.aligo.get_file(file_id=item.file_id, drive_id=item.drive_id) return self.__get_fileitem(item) - return None + # 逐级查找和创建目录 + fileitem = schemas.FileItem(path="/") + for part in path.parts: + if part == "/": + continue + dir_file = __find_dir(fileitem, part) + if dir_file: + fileitem = dir_file + else: + dir_file = self.create_folder(fileitem, part) + if not dir_file: + return None + fileitem = dir_file + return fileitem def get_item(self, path: Path) -> Optional[schemas.FileItem]: """ diff --git a/app/modules/filemanager/storages/alist.py b/app/modules/filemanager/storages/alist.py index 85d18ff7..0f4d05c1 100644 --- a/app/modules/filemanager/storages/alist.py +++ b/app/modules/filemanager/storages/alist.py @@ -233,6 +233,8 @@ class Alist(StorageBase, metaclass=Singleton): ) -> Optional[schemas.FileItem]: """ 创建目录 + :param fileitem: 父目录 + :param name: 目录名 """ path = Path(fileitem.path) / name resp: Response = RequestUtils( @@ -271,14 +273,16 @@ class Alist(StorageBase, metaclass=Singleton): 获取目录,如目录不存在则创建 """ folder = self.get_item(path) + if folder: + return folder if not folder: - folder = self.create_folder(self.get_parent(schemas.FileItem( + folder = self.create_folder(schemas.FileItem( storage=self.schema.value, type="dir", - path=path.as_posix() + "/", + path=path.parent.as_posix(), name=path.name, basename=path.stem - )), path.name) + ), path.name) return folder def get_item( diff --git a/app/modules/filemanager/storages/local.py b/app/modules/filemanager/storages/local.py index 2dd8f799..38cd059f 100644 --- a/app/modules/filemanager/storages/local.py +++ b/app/modules/filemanager/storages/local.py @@ -115,6 +115,8 @@ class LocalStorage(StorageBase): def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]: """ 创建目录 + :param fileitem: 父目录 + :param name: 目录名 """ if not fileitem.path: return None diff --git a/app/modules/filemanager/storages/rclone.py b/app/modules/filemanager/storages/rclone.py index 7999d9ba..e38efa67 100644 --- a/app/modules/filemanager/storages/rclone.py +++ b/app/modules/filemanager/storages/rclone.py @@ -139,6 +139,8 @@ class Rclone(StorageBase): def create_folder(self, fileitem: schemas.FileItem, name: str) -> Optional[schemas.FileItem]: """ 创建目录 + :param fileitem: 父目录 + :param name: 目录名 """ try: retcode = subprocess.run( @@ -149,10 +151,7 @@ class Rclone(StorageBase): startupinfo=self.__get_hidden_shell() ).returncode if retcode == 0: - ret_fileitem = copy.deepcopy(fileitem) - ret_fileitem.path = f"{fileitem.path}/{name}/" - ret_fileitem.name = name - return ret_fileitem + return self.get_item(Path(f"{fileitem.path}/{name}")) except Exception as err: logger.error(f"rclone创建目录失败:{err}") return None @@ -166,11 +165,11 @@ class Rclone(StorageBase): """ 查找下级目录中匹配名称的目录 """ - for sub_file in self.list(_fileitem): - if sub_file.type != "dir": + for sub_folder in self.list(_fileitem): + if sub_folder.type != "dir": continue - if sub_file.name == _name: - return sub_file + if sub_folder.name == _name: + return sub_folder return None # 逐级查找和创建目录 diff --git a/app/modules/filemanager/storages/u115.py b/app/modules/filemanager/storages/u115.py index 1889fc91..38cde2ed 100644 --- a/app/modules/filemanager/storages/u115.py +++ b/app/modules/filemanager/storages/u115.py @@ -225,6 +225,9 @@ class U115Pan(StorageBase, metaclass=Singleton): """ if not self.client: return None + folder = self.get_item(path) + if folder: + return folder try: result = self.client.fs.makedirs(path, exist_ok=True) if result: