def _get_file_real_path(self, file: str) -> str: """ 获取文件真实路径 @param {str} file - 传入的文件路径 @returns {str} - 返回文件真实路径 @throws {FileNotUnderWorkDirError} - 锁定工作目录的情况如果文件路径不在工作目录下,抛出异常 """ # 进行参数控制和校验 _work_dir = os.getcwd() if self.work_dir is None else self.work_dir _file = os.path.realpath(os.path.join(_work_dir, file)) if self.lock_in_work_dir and not FileTool.is_file_in_subdir( _file, _work_dir): # 控制文件必须在指定目录下 raise FileNotUnderWorkDirError('file not under work dir') return _file
def push_transfer_init_saver(self, file: str, is_resume: bool = True, file_size: int = None, md5: str = None, is_overwrite: bool = False, extend_info: dict = None, thread_num: int = 1, block_size: int = 4096, cache_size: int = 1024, auto_expand: bool = True) -> dict: """ 初始化文件保存对象 @param {str} file - 要保存的文件路径(工作目录的相对路径) @param {bool} is_resume=True - 指定是否续传(自动查找已下载的信息), 如果不指定续传将自动删除原来已下载临时文件 注:如果指定续传,且可以找到原来的临时文件,则以下参数将使用原来的信息,如果有传入则会进行差异值的校验: file_size、md5 @param {int} file_size=None - 文件大小,单位为byte, 如果为None代表未知文件大小, 此时auto_expand参数固定为True @param {str} md5=None - 验证文件的md5字符串,如果不传代表不进行验证 @param {bool} is_overwrite=False - 是否覆盖已有文件,如果为否,则目标文件已存在的情况下抛出异常 @param {dict} extend_info=None - 处理过程中要保存的信息字典,例如保存文件下载路径,引用页等信息 @param {int} thread_num=1 - 写入处理线程数量 @param {int} block_size=4096 - 每次写入块大小,单位为byte @param {int} cache_size=1024 - 单线程缓存大小,单位为kb(注意:真实缓存大小还需要乘以处理线程数量) @param {bool} auto_expand=True - 是否自动扩展文件大小(否则在初始化时会自动创建指定大小的文件) @returns {dict} - 返回文件保存对象的信息 { 'id': '生成saver对应的uuid', 'thread_num': saver的实际线程数 } """ # 进行参数控制和校验 _work_dir = os.getcwd() if self.work_dir is None else self.work_dir _file = os.path.realpath(os.path.join(_work_dir, file)) if self.lock_in_work_dir and not FileTool.is_file_in_subdir( _file, _work_dir): # 控制文件必须在指定目录下 raise FileNotUnderWorkDirError('file not under work dir') _thread_num = thread_num if self.max_thread_num > 0: _thread_num = min(self.max_thread_num, _thread_num) _cache_size = cache_size if self.max_cache_size > 0: _cache_size = min(self.max_cache_size, _cache_size) _uuid = str(uuid.uuid1()) _saver = TransferSaver(_file, is_resume=is_resume, file_size=file_size, md5=md5, is_overwrite=is_overwrite, extend_info=extend_info, thread_num=_thread_num, block_size=block_size, cache_size=_cache_size, auto_expand=auto_expand) self._dealing_saver[_uuid] = { 'saver': _saver, 'last': datetime.datetime.now() } # 返回结果 return {'id': _uuid, 'thread_num': _saver._thread_num}