Esempio n. 1
0
    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
Esempio n. 2
0
    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}