From d6c6ee9b4e093de35880c8c33bbf71b16ff103e0 Mon Sep 17 00:00:00 2001 From: jxxghp Date: Thu, 14 Nov 2024 12:38:02 +0800 Subject: [PATCH] fix #3092 --- app/modules/filemanager/storages/alist.py | 50 ++++++++++++++++++----- app/utils/string.py | 11 ----- app/utils/url.py | 12 ++++++ 3 files changed, 51 insertions(+), 22 deletions(-) diff --git a/app/modules/filemanager/storages/alist.py b/app/modules/filemanager/storages/alist.py index 607d2e55..41aeba82 100644 --- a/app/modules/filemanager/storages/alist.py +++ b/app/modules/filemanager/storages/alist.py @@ -10,7 +10,7 @@ from app.log import logger from app.modules.filemanager.storages import StorageBase from app.schemas.types import StorageSchema from app.utils.http import RequestUtils -from app.utils.string import StringUtils +from app.utils.url import UrlUtils class Alist(StorageBase): @@ -32,9 +32,6 @@ class Alist(StorageBase): super().__init__() self.req = RequestUtils(headers=self.__get_header_with_token()) - def check_login(self, *args, **kwargs) -> Optional[Dict[str, str]]: - pass - @property def __get_base_url(self) -> str: """ @@ -43,13 +40,13 @@ class Alist(StorageBase): url = self.get_conf().get("url") if url is None: return "" - return StringUtils.get_base_url(url) + return UrlUtils.standardize_base_url(self.get_conf().get("url")) def __get_api_url(self, path: str) -> str: """ 获取API URL """ - return self.__get_base_url + path + return UrlUtils.adapt_request_url(self.__get_base_url, path) @property def __get_valuable_toke(self) -> str: @@ -215,7 +212,7 @@ class Alist(StorageBase): """ path = Path(fileitem.path) / name resp: Response = self.req.post_res( - self.__get_api_url("/api/auth/login"), + self.__get_api_url("/api/fs/mkdir"), json={"path": path}, ) """ @@ -229,6 +226,9 @@ class Alist(StorageBase): "data": null } """ + if resp is None: + logging.warning(f"请求创建目录 {path} 失败,无法连接alist服务") + return if resp.status_code != 200: logging.warning(f"请求创建目录 {path} 失败,状态码:{resp.status_code}") return @@ -242,11 +242,17 @@ class Alist(StorageBase): def get_folder(self, path: Path) -> Optional[schemas.FileItem]: """ - FIXME 获取目录,如目录不存在则创建 + 获取目录,如目录不存在则创建 """ folder = self.get_item(path) if not folder: - folder = self.create_folder(self.get_parent(path), path.name) + folder = self.create_folder(self.get_parent(schemas.FileItem( + storage=self.schema.value, + type="dir", + path=path.as_posix(), + name=path.name, + basename=path.stem + )), path.name) return folder def get_item( @@ -306,6 +312,9 @@ class Alist(StorageBase): } } """ + if resp is None: + logging.warning(f"请求获取文件 {path} 失败,无法连接alist服务") + return if resp.status_code != 200: logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}") return @@ -358,6 +367,9 @@ class Alist(StorageBase): "data": null } """ + if resp is None: + logging.warning(f"请求删除文件 {fileitem.path} 失败,无法连接alist服务") + return False if resp.status_code != 200: logging.warning( f"请求删除文件 {fileitem.path} 失败,状态码:{resp.status_code}" @@ -395,6 +407,9 @@ class Alist(StorageBase): "data": null } """ + if not resp: + logging.warning(f"请求重命名文件 {fileitem.path} 失败,无法连接alist服务") + return False if resp.status_code != 200: logging.warning( f"请求重命名文件 {fileitem.path} 失败,状态码:{resp.status_code}" @@ -457,6 +472,9 @@ class Alist(StorageBase): } } """ + if not resp: + logging.warning(f"请求获取文件 {path} 失败,无法连接alist服务") + return if resp.status_code != 200: logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}") return @@ -469,7 +487,7 @@ class Alist(StorageBase): if raw_url: download_url = result["data"]["raw_url"] else: - download_url = self.__get_base_url + "/d" + fileitem.path + download_url = UrlUtils.adapt_request_url(self.__get_base_url, f"/d{fileitem.path}") if result["data"]["sign"]: download_url = download_url + "?sign=" + result["data"]["sign"] @@ -490,7 +508,7 @@ class Alist(StorageBase): :param path: 本地文件路径 :param task: 是否为任务,默认为False避免未完成上传时对文件进行操作 """ - encoded_path = StringUtils.url_eqote(fileitem.path) + encoded_path = UrlUtils.quote(fileitem.path) headers = self.__get_header_with_token() headers.setdefault("Content-Type", "multipart/form-data") headers.setdefault("As-Task", str(task).lower()) @@ -573,6 +591,11 @@ class Alist(StorageBase): "data": null } """ + if resp is None: + logging.warning( + f"请求复制文件 {fileitem.path} 失败,无法连接alist服务" + ) + return False if resp.status_code != 200: logging.warning( f"请求复制文件 {fileitem.path} 失败,状态码:{resp.status_code}" @@ -622,6 +645,11 @@ class Alist(StorageBase): "data": null } """ + if resp is None: + logging.warning( + f"请求移动文件 {fileitem.path} 失败,无法连接alist服务" + ) + return False if resp.status_code != 200: logging.warning( f"请求移动文件 {fileitem.path} 失败,状态码:{resp.status_code}" diff --git a/app/utils/string.py b/app/utils/string.py index 0710fb98..1960de63 100644 --- a/app/utils/string.py +++ b/app/utils/string.py @@ -805,14 +805,3 @@ class StringUtils: :return: 如果elem有效(非None且长度大于0),返回True;否则返回False """ return elem is not None and len(elem) > 0 - - @staticmethod - def url_eqote(s:str) -> str: - """ - 将字符串编码为 URL 安全的格式 - 这将确保路径中的特殊字符(如空格、中文字符等)被正确编码,以便在 URL 中传输 - - :param s: 要编码的字符串 - :return: 编码后的字符串 - """ - return parse.quote(s) diff --git a/app/utils/url.py b/app/utils/url.py index 15bac9e2..5e932332 100644 --- a/app/utils/url.py +++ b/app/utils/url.py @@ -1,6 +1,7 @@ import mimetypes from pathlib import Path from typing import Optional, Union +from urllib import parse from urllib.parse import parse_qs, urlencode, urljoin, urlparse, urlunparse from app.log import logger @@ -95,3 +96,14 @@ class UrlUtils: except Exception as e: logger.debug(f"Error get_mime_type: {e}") return default_type + + @staticmethod + def quote(s: str) -> str: + """ + 将字符串编码为 URL 安全的格式 + 这将确保路径中的特殊字符(如空格、中文字符等)被正确编码,以便在 URL 中传输 + + :param s: 要编码的字符串 + :return: 编码后的字符串 + """ + return parse.quote(s)