(self, config: dict, context: ExecutionContext)
| 83 | return "share_file" |
| 84 | |
| 85 | async def execute(self, config: dict, context: ExecutionContext) -> ModuleResult: |
| 86 | from app.services.file_share import start_file_share, get_local_ip |
| 87 | |
| 88 | file_path = context.resolve_value(config.get("filePath", "")) |
| 89 | port = to_int(config.get("port", 8080), 8080, context) |
| 90 | result_variable = config.get("resultVariable", "share_url") |
| 91 | |
| 92 | if not file_path: |
| 93 | return ModuleResult(success=False, error="文件路径不能为空") |
| 94 | |
| 95 | file = Path(file_path) |
| 96 | if not file.exists(): |
| 97 | return ModuleResult(success=False, error=f"文件不存在: {file_path}") |
| 98 | |
| 99 | if not file.is_file(): |
| 100 | return ModuleResult(success=False, error=f"路径不是文件: {file_path}") |
| 101 | |
| 102 | try: |
| 103 | result = start_file_share( |
| 104 | path=str(file.resolve()), |
| 105 | port=port, |
| 106 | share_type='file', |
| 107 | name=file.name |
| 108 | ) |
| 109 | |
| 110 | if not result['success']: |
| 111 | return ModuleResult(success=False, error=result.get('error', '启动共享服务失败')) |
| 112 | |
| 113 | share_url = result['url'] |
| 114 | local_ip = result['ip'] |
| 115 | file_size = file.stat().st_size |
| 116 | |
| 117 | # 格式化文件大小 |
| 118 | size_str = self._format_size(file_size) |
| 119 | |
| 120 | if result_variable: |
| 121 | context.set_variable(result_variable, share_url) |
| 122 | |
| 123 | message = f"📄 文件共享已启动!\n" \ |
| 124 | f"文件名: {file.name}\n" \ |
| 125 | f"文件大小: {size_str}\n" \ |
| 126 | f"访问地址: {share_url}\n" \ |
| 127 | f"💡 同局域网的设备可以使用浏览器访问上述地址来下载此文件" |
| 128 | |
| 129 | return ModuleResult( |
| 130 | success=True, |
| 131 | message=message, |
| 132 | data={ |
| 133 | 'url': share_url, |
| 134 | 'ip': local_ip, |
| 135 | 'port': port, |
| 136 | 'path': str(file.resolve()), |
| 137 | 'name': file.name, |
| 138 | 'size': file_size |
| 139 | } |
| 140 | ) |
| 141 | |
| 142 | except Exception as e: |
nothing calls this directly
no test coverage detected