This commit is contained in:
jxxghp
2024-11-14 12:38:02 +08:00
parent 4b27404ee5
commit d6c6ee9b4e
3 changed files with 51 additions and 22 deletions

View File

@@ -10,7 +10,7 @@ from app.log import logger
from app.modules.filemanager.storages import StorageBase from app.modules.filemanager.storages import StorageBase
from app.schemas.types import StorageSchema from app.schemas.types import StorageSchema
from app.utils.http import RequestUtils from app.utils.http import RequestUtils
from app.utils.string import StringUtils from app.utils.url import UrlUtils
class Alist(StorageBase): class Alist(StorageBase):
@@ -32,9 +32,6 @@ class Alist(StorageBase):
super().__init__() super().__init__()
self.req = RequestUtils(headers=self.__get_header_with_token()) self.req = RequestUtils(headers=self.__get_header_with_token())
def check_login(self, *args, **kwargs) -> Optional[Dict[str, str]]:
pass
@property @property
def __get_base_url(self) -> str: def __get_base_url(self) -> str:
""" """
@@ -43,13 +40,13 @@ class Alist(StorageBase):
url = self.get_conf().get("url") url = self.get_conf().get("url")
if url is None: if url is None:
return "" 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: def __get_api_url(self, path: str) -> str:
""" """
获取API URL 获取API URL
""" """
return self.__get_base_url + path return UrlUtils.adapt_request_url(self.__get_base_url, path)
@property @property
def __get_valuable_toke(self) -> str: def __get_valuable_toke(self) -> str:
@@ -215,7 +212,7 @@ class Alist(StorageBase):
""" """
path = Path(fileitem.path) / name path = Path(fileitem.path) / name
resp: Response = self.req.post_res( resp: Response = self.req.post_res(
self.__get_api_url("/api/auth/login"), self.__get_api_url("/api/fs/mkdir"),
json={"path": path}, json={"path": path},
) )
""" """
@@ -229,6 +226,9 @@ class Alist(StorageBase):
"data": null "data": null
} }
""" """
if resp is None:
logging.warning(f"请求创建目录 {path} 失败无法连接alist服务")
return
if resp.status_code != 200: if resp.status_code != 200:
logging.warning(f"请求创建目录 {path} 失败,状态码:{resp.status_code}") logging.warning(f"请求创建目录 {path} 失败,状态码:{resp.status_code}")
return return
@@ -242,11 +242,17 @@ class Alist(StorageBase):
def get_folder(self, path: Path) -> Optional[schemas.FileItem]: def get_folder(self, path: Path) -> Optional[schemas.FileItem]:
""" """
FIXME 获取目录,如目录不存在则创建 获取目录,如目录不存在则创建
""" """
folder = self.get_item(path) folder = self.get_item(path)
if not folder: 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 return folder
def get_item( 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: if resp.status_code != 200:
logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}") logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}")
return return
@@ -358,6 +367,9 @@ class Alist(StorageBase):
"data": null "data": null
} }
""" """
if resp is None:
logging.warning(f"请求删除文件 {fileitem.path} 失败无法连接alist服务")
return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logging.warning(
f"请求删除文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"请求删除文件 {fileitem.path} 失败,状态码:{resp.status_code}"
@@ -395,6 +407,9 @@ class Alist(StorageBase):
"data": null "data": null
} }
""" """
if not resp:
logging.warning(f"请求重命名文件 {fileitem.path} 失败无法连接alist服务")
return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logging.warning(
f"请求重命名文件 {fileitem.path} 失败,状态码:{resp.status_code}" 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: if resp.status_code != 200:
logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}") logging.warning(f"请求获取文件 {path} 失败,状态码:{resp.status_code}")
return return
@@ -469,7 +487,7 @@ class Alist(StorageBase):
if raw_url: if raw_url:
download_url = result["data"]["raw_url"] download_url = result["data"]["raw_url"]
else: 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"]: if result["data"]["sign"]:
download_url = download_url + "?sign=" + result["data"]["sign"] download_url = download_url + "?sign=" + result["data"]["sign"]
@@ -490,7 +508,7 @@ class Alist(StorageBase):
:param path: 本地文件路径 :param path: 本地文件路径
:param task: 是否为任务默认为False避免未完成上传时对文件进行操作 :param task: 是否为任务默认为False避免未完成上传时对文件进行操作
""" """
encoded_path = StringUtils.url_eqote(fileitem.path) encoded_path = UrlUtils.quote(fileitem.path)
headers = self.__get_header_with_token() headers = self.__get_header_with_token()
headers.setdefault("Content-Type", "multipart/form-data") headers.setdefault("Content-Type", "multipart/form-data")
headers.setdefault("As-Task", str(task).lower()) headers.setdefault("As-Task", str(task).lower())
@@ -573,6 +591,11 @@ class Alist(StorageBase):
"data": null "data": null
} }
""" """
if resp is None:
logging.warning(
f"请求复制文件 {fileitem.path} 失败无法连接alist服务"
)
return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logging.warning(
f"请求复制文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"请求复制文件 {fileitem.path} 失败,状态码:{resp.status_code}"
@@ -622,6 +645,11 @@ class Alist(StorageBase):
"data": null "data": null
} }
""" """
if resp is None:
logging.warning(
f"请求移动文件 {fileitem.path} 失败无法连接alist服务"
)
return False
if resp.status_code != 200: if resp.status_code != 200:
logging.warning( logging.warning(
f"请求移动文件 {fileitem.path} 失败,状态码:{resp.status_code}" f"请求移动文件 {fileitem.path} 失败,状态码:{resp.status_code}"

View File

@@ -805,14 +805,3 @@ class StringUtils:
:return: 如果elem有效非None且长度大于0返回True否则返回False :return: 如果elem有效非None且长度大于0返回True否则返回False
""" """
return elem is not None and len(elem) > 0 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)

View File

@@ -1,6 +1,7 @@
import mimetypes import mimetypes
from pathlib import Path from pathlib import Path
from typing import Optional, Union from typing import Optional, Union
from urllib import parse
from urllib.parse import parse_qs, urlencode, urljoin, urlparse, urlunparse from urllib.parse import parse_qs, urlencode, urljoin, urlparse, urlunparse
from app.log import logger from app.log import logger
@@ -95,3 +96,14 @@ class UrlUtils:
except Exception as e: except Exception as e:
logger.debug(f"Error get_mime_type: {e}") logger.debug(f"Error get_mime_type: {e}")
return default_type return default_type
@staticmethod
def quote(s: str) -> str:
"""
将字符串编码为 URL 安全的格式
这将确保路径中的特殊字符(如空格、中文字符等)被正确编码,以便在 URL 中传输
:param s: 要编码的字符串
:return: 编码后的字符串
"""
return parse.quote(s)