From a5f90f5dd9188420543d4e0d73d1b716ebc9f3f1 Mon Sep 17 00:00:00 2001 From: g1879 Date: Mon, 3 Aug 2020 19:20:06 +0800 Subject: [PATCH] =?UTF-8?q?download=E5=87=BD=E6=95=B0=E4=BC=9A=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E8=B7=AF=E5=BE=84=E4=B8=AD=E7=9A=84=E9=9D=9E=E6=B3=95?= =?UTF-8?q?=E5=AD=97=E7=AC=A6=EF=BC=8C=E5=B9=B6=E8=BF=94=E5=9B=9E=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DrissionPage/session_page.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/DrissionPage/session_page.py b/DrissionPage/session_page.py index c66425b..d17d0b1 100644 --- a/DrissionPage/session_page.py +++ b/DrissionPage/session_page.py @@ -7,7 +7,7 @@ import os import re from pathlib import Path -from random import random +from random import randint from time import time from typing import Union, List from urllib.parse import urlparse, quote @@ -128,7 +128,7 @@ class SessionPage(object): :param kwargs: 连接参数 :param file_exists: 若存在同名文件,可选择'rename', 'overwrite', 'skip'方式处理 :param show_msg: 是否显示下载信息 - :return: 元组,bool和状态信息(成功时信息为文件名) + :return: 元组,bool和状态信息(成功时信息为文件路径) """ goal_path = goal_path or OptionsManager().get_value('paths', 'global_tmp_path') if not goal_path: @@ -150,7 +150,7 @@ class SessionPage(object): elif os.path.basename(file_url): file_name = os.path.basename(file_url).split("?")[0] else: - file_name = f'untitled_{time()}_{random.randint(0, 100)}' + file_name = f'untitled_{time()}_{randint(0, 100)}' if rename: # 重命名文件,不改变扩展名 ext_name = file_name.split('.')[-1] @@ -161,7 +161,14 @@ class SessionPage(object): else: full_name = file_name + full_name = re.sub(r'[\\/*:|<>?"]', '', full_name).strip() + goal_Path = Path(goal_path) + goal_path = '' + for key, i in enumerate(goal_Path.parts): # 去除路径中的非法字符 + goal_path += goal_Path.drive if key == 0 and goal_Path.drive else re.sub(r'[*:|<>?"]', '', i).strip() + goal_path += '\\' if i != '\\' and key < len(goal_Path.parts) - 1 else '' full_path = Path(f'{goal_path}\\{full_name}') + if full_path.exists(): if file_exists == 'skip': return False, 'A file with the same name already exists.' @@ -171,7 +178,9 @@ class SessionPage(object): full_name = avoid_duplicate_name(goal_path, full_name) full_path = Path(f'{goal_path}\\{full_name}') else: - raise ValueError("file_exists can only be selected in'skip', 'overwrite', 'rename'") + raise ValueError("file_exists can only be selected in 'skip', 'overwrite', 'rename'") + Path(goal_path).mkdir(parents=True, exist_ok=True) + # 打印要下载的文件 if show_msg: print_txt = full_name if file_name == full_name else f'{file_name} -> {full_name}' @@ -206,13 +215,13 @@ class SessionPage(object): # -------------------显示并返回值------------------- if show_msg: print(info) - info = full_name if download_status else info + info = f'{goal_path}\\{full_name}' if download_status else info return download_status, info def _make_response(self, url: str, mode: str = 'get', data: dict = None, **kwargs) -> Union[HTMLResponse, bool]: """生成response对象。接收mode参数,以决定用什么方式。 :param url: 要访问的网址 - :param mode: 'get','post'中选择 + :param mode: 'get', 'post'中选择 :param data: 提交的数据 :param kwargs: 其它参数 :return: Response对象