dangthr commited on
Commit
d61a965
·
verified ·
1 Parent(s): 558f2c8

Update remote_uploader.py

Browse files
Files changed (1) hide show
  1. 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
- auth_msg = {
36
- "type": "auth",
37
- "api_key": self.api_key,
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
- return False
 
 
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=30)
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="https://gkbtyo-rqvays-5001.preview.cloudstudio.work", help="服务器的 URL 地址")
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))