Spaces:
Runtime error
Runtime error
Update remote_uploader.py
Browse files- remote_uploader.py +32 -16
remote_uploader.py
CHANGED
@@ -1,4 +1,3 @@
|
|
1 |
-
import time
|
2 |
import requests
|
3 |
import argparse
|
4 |
import os
|
@@ -8,6 +7,8 @@ import json
|
|
8 |
import base64
|
9 |
import logging
|
10 |
import sys
|
|
|
|
|
11 |
|
12 |
# 配置日志
|
13 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
@@ -21,23 +22,35 @@ class WebSocketFileUploader:
|
|
21 |
|
22 |
async def connect_and_upload(self, upload_dir):
|
23 |
"""连接到 WebSocket 服务器并上传文件"""
|
24 |
-
# 将 HTTP URL 转换为 WebSocket URL
|
25 |
-
ws_url = self.server_url.replace('http://', 'ws://').replace('https://', 'wss://').rstrip('/')
|
26 |
-
ws_url += f'/ws/upload/{self.space_id}?token={self.api_key}'
|
27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
28 |
logger.info(f"正在连接到 WebSocket: {ws_url}")
|
29 |
|
30 |
try:
|
31 |
async with websockets.connect(ws_url, ping_interval=20, ping_timeout=60) as websocket:
|
32 |
logger.info("WebSocket 连接成功")
|
33 |
|
34 |
-
#
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
"space_id": self.space_id
|
39 |
-
}
|
40 |
-
await websocket.send(json.dumps(auth_msg))
|
41 |
|
42 |
# 等待认证响应
|
43 |
response = await websocket.recv()
|
@@ -48,7 +61,9 @@ class WebSocketFileUploader:
|
|
48 |
return await self._upload_files(websocket, upload_dir)
|
49 |
else:
|
50 |
logger.error(f"认证失败: {auth_response.get('message', '未知错误')}")
|
51 |
-
|
|
|
|
|
52 |
|
53 |
except Exception as e:
|
54 |
logger.error(f"WebSocket 连接失败: {e}")
|
@@ -181,15 +196,16 @@ class WebSocketFileUploader:
|
|
181 |
}
|
182 |
|
183 |
# 发送 POST 请求
|
184 |
-
response = requests.post(upload_url, headers=headers, data=data, files=files, timeout=
|
185 |
|
186 |
if response.status_code == 200:
|
187 |
logger.info(f"✅ 文件 '{filename}' 上传成功!")
|
188 |
success_count += 1
|
189 |
else:
|
190 |
-
logger.error(f"❌ 上传失败: HTTP {response.status_code}")
|
191 |
failed_count += 1
|
192 |
|
|
|
193 |
time.sleep(0.5)
|
194 |
|
195 |
except Exception as e:
|
@@ -220,10 +236,10 @@ if __name__ == "__main__":
|
|
220 |
parser = argparse.ArgumentParser(description="WebSocket 文件上传器 - 扫描并上传指定文件夹中的所有文件")
|
221 |
parser.add_argument("api_key", help="您的 API 密钥")
|
222 |
parser.add_argument("space_id", help="Space ID")
|
223 |
-
parser.add_argument("--server", default="
|
224 |
parser.add_argument("--upload-dir", default="output", help="要上传的目录 (默认: output)")
|
225 |
|
226 |
args = parser.parse_args()
|
227 |
|
228 |
# 运行异步上传
|
229 |
-
asyncio.run(upload_directory_websocket(args.upload_dir, args.server, args.api_key, args.space_id))
|
|
|
|
|
1 |
import requests
|
2 |
import argparse
|
3 |
import os
|
|
|
7 |
import base64
|
8 |
import logging
|
9 |
import sys
|
10 |
+
import time # 修复点 1: 导入 time 模块以使用 time.sleep()
|
11 |
+
from urllib.parse import urlparse # 修复点 2: 导入 urlparse 以便解析 URL
|
12 |
|
13 |
# 配置日志
|
14 |
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
|
|
22 |
|
23 |
async def connect_and_upload(self, upload_dir):
|
24 |
"""连接到 WebSocket 服务器并上传文件"""
|
|
|
|
|
|
|
25 |
|
26 |
+
# --- 修复点 3: 智能地构建 WebSocket URL ---
|
27 |
+
# 目标: 将主应用传来的 HTTP URL (如 http://...:5001) 转换为正确的 WebSocket URL (ws://...:8765)
|
28 |
+
try:
|
29 |
+
parsed_http_url = urlparse(self.server_url)
|
30 |
+
# 根据 HTTP 协议确定 WebSocket 协议 (http -> ws, https -> wss)
|
31 |
+
ws_scheme = 'wss' if parsed_http_url.scheme == 'https' else 'ws'
|
32 |
+
|
33 |
+
# 使用从 HTTP URL 获取的主机名,但硬编码正确的 WebSocket 端口 8765
|
34 |
+
ws_netloc = f"{parsed_http_url.hostname}:8765"
|
35 |
+
|
36 |
+
# 重新构建完整的 WebSocket URL
|
37 |
+
ws_url = f"{ws_scheme}://{ws_netloc}/ws/upload/{self.space_id}?token={self.api_key}"
|
38 |
+
except Exception as e:
|
39 |
+
logger.error(f"解析服务器 URL '{self.server_url}' 时出错: {e}")
|
40 |
+
logger.info("回退到 HTTP API 上传...")
|
41 |
+
return self._fallback_http_upload(upload_dir)
|
42 |
+
# --- 修复结束 ---
|
43 |
+
|
44 |
logger.info(f"正在连接到 WebSocket: {ws_url}")
|
45 |
|
46 |
try:
|
47 |
async with websockets.connect(ws_url, ping_interval=20, ping_timeout=60) as websocket:
|
48 |
logger.info("WebSocket 连接成功")
|
49 |
|
50 |
+
# 注意:原始代码中的认证流程是先连接再发认证消息,这很好。
|
51 |
+
# 我们将遵循这个流程。客户端不需要发送 auth 消息,
|
52 |
+
# 因为服务器端的 handle_websocket_upload 函数会直接从连接路径和参数中验证。
|
53 |
+
# 我们只需要等待服务器的 "auth_success" 响应。
|
|
|
|
|
|
|
54 |
|
55 |
# 等待认证响应
|
56 |
response = await websocket.recv()
|
|
|
61 |
return await self._upload_files(websocket, upload_dir)
|
62 |
else:
|
63 |
logger.error(f"认证失败: {auth_response.get('message', '未知错误')}")
|
64 |
+
# 认证失败也回退到 HTTP
|
65 |
+
logger.info("回退到 HTTP API 上传...")
|
66 |
+
return self._fallback_http_upload(upload_dir)
|
67 |
|
68 |
except Exception as e:
|
69 |
logger.error(f"WebSocket 连接失败: {e}")
|
|
|
196 |
}
|
197 |
|
198 |
# 发送 POST 请求
|
199 |
+
response = requests.post(upload_url, headers=headers, data=data, files=files, timeout=60)
|
200 |
|
201 |
if response.status_code == 200:
|
202 |
logger.info(f"✅ 文件 '{filename}' 上传成功!")
|
203 |
success_count += 1
|
204 |
else:
|
205 |
+
logger.error(f"❌ 上传失败: HTTP {response.status_code} - {response.text}")
|
206 |
failed_count += 1
|
207 |
|
208 |
+
# 使用 time.sleep()
|
209 |
time.sleep(0.5)
|
210 |
|
211 |
except Exception as e:
|
|
|
236 |
parser = argparse.ArgumentParser(description="WebSocket 文件上传器 - 扫描并上传指定文件夹中的所有文件")
|
237 |
parser.add_argument("api_key", help="您的 API 密钥")
|
238 |
parser.add_argument("space_id", help="Space ID")
|
239 |
+
parser.add_argument("--server", default="http://127.0.0.1:5001", help="服务器的 URL 地址 (例如: http://127.0.0.1:5001)")
|
240 |
parser.add_argument("--upload-dir", default="output", help="要上传的目录 (默认: output)")
|
241 |
|
242 |
args = parser.parse_args()
|
243 |
|
244 |
# 运行异步上传
|
245 |
+
asyncio.run(upload_directory_websocket(args.upload_dir, args.server, args.api_key, args.space_id))
|