Spaces:
Runtime error
Runtime error
Update remote_uploader.py
Browse files- remote_uploader.py +64 -54
remote_uploader.py
CHANGED
|
@@ -1,16 +1,31 @@
|
|
| 1 |
-
import
|
| 2 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
import os
|
| 4 |
-
import
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
-
class
|
| 7 |
def __init__(self, server_url, api_key, space_id):
|
| 8 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
self.api_key = api_key
|
| 10 |
self.space_id = space_id
|
| 11 |
|
| 12 |
-
def upload_file(self, file_path):
|
| 13 |
-
"""上传单个文件"""
|
| 14 |
if not os.path.exists(file_path):
|
| 15 |
print(f"文件不存在: {file_path}")
|
| 16 |
return False
|
|
@@ -18,65 +33,57 @@ class FileUploader:
|
|
| 18 |
filename = os.path.basename(file_path)
|
| 19 |
print(f"正在上传文件: {filename}")
|
| 20 |
|
| 21 |
-
# 构建完整的 API 端点 URL
|
| 22 |
-
upload_url = f"{self.server_url.rstrip('/')}/api/remote_upload"
|
| 23 |
-
|
| 24 |
-
# 准备请求头和数据
|
| 25 |
-
headers = {
|
| 26 |
-
'X-API-Key': self.api_key
|
| 27 |
-
}
|
| 28 |
-
data = {
|
| 29 |
-
'space_id': self.space_id
|
| 30 |
-
}
|
| 31 |
-
|
| 32 |
-
# 读取文件内容并上传
|
| 33 |
try:
|
|
|
|
| 34 |
with open(file_path, 'rb') as f:
|
| 35 |
-
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
}
|
| 38 |
|
| 39 |
-
|
| 40 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
|
| 42 |
-
|
| 43 |
-
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
print(
|
| 47 |
-
if response.status_code == 200:
|
| 48 |
-
print(f"✅ 文件 '{filename}' 上传成功!")
|
| 49 |
-
return True
|
| 50 |
-
else:
|
| 51 |
-
print(f"❌ 上传失败: {result.get('error', '未知错误')}")
|
| 52 |
-
return False
|
| 53 |
-
except requests.exceptions.JSONDecodeError:
|
| 54 |
-
print(response.text)
|
| 55 |
return False
|
| 56 |
|
| 57 |
-
except
|
| 58 |
-
print(f"
|
| 59 |
-
return False
|
| 60 |
-
except requests.exceptions.RequestException as e:
|
| 61 |
-
print(f"请求时出错: {e}")
|
| 62 |
return False
|
| 63 |
|
| 64 |
-
def upload_directory_once(
|
| 65 |
"""一次性扫描并上传目录中的所有文件"""
|
| 66 |
-
if not os.path.exists(
|
| 67 |
-
print(f"目录不存在: {
|
| 68 |
return
|
| 69 |
|
| 70 |
-
print(f"🔍 开始扫描目录: {
|
| 71 |
print(f"📡 服务器地址: {server_url}")
|
| 72 |
print(f"🔑 Space ID: {space_id}")
|
| 73 |
print("-" * 50)
|
| 74 |
|
| 75 |
-
uploader =
|
| 76 |
|
| 77 |
# 获取所有文件
|
| 78 |
all_files = []
|
| 79 |
-
for root, dirs, files in os.walk(
|
| 80 |
for file in files:
|
| 81 |
file_path = os.path.join(root, file)
|
| 82 |
if os.path.isfile(file_path):
|
|
@@ -93,12 +100,12 @@ def upload_directory_once(watch_dir, server_url, api_key, space_id):
|
|
| 93 |
|
| 94 |
for file_path in all_files:
|
| 95 |
try:
|
| 96 |
-
if uploader.upload_file(file_path):
|
| 97 |
success_count += 1
|
| 98 |
else:
|
| 99 |
failed_count += 1
|
| 100 |
# 稍微延迟一下,避免服务器压力过大
|
| 101 |
-
|
| 102 |
except Exception as e:
|
| 103 |
print(f"上传文件 {file_path} 时发生异常: {e}")
|
| 104 |
failed_count += 1
|
|
@@ -111,14 +118,17 @@ def upload_directory_once(watch_dir, server_url, api_key, space_id):
|
|
| 111 |
|
| 112 |
return success_count, failed_count
|
| 113 |
|
| 114 |
-
|
| 115 |
-
parser = argparse.ArgumentParser(description="
|
| 116 |
parser.add_argument("api_key", help="您的 API 密钥")
|
| 117 |
parser.add_argument("space_id", help="Space ID")
|
| 118 |
-
parser.add_argument("--server", default="
|
| 119 |
parser.add_argument("--upload-dir", default="output", help="要上传的目录 (默认: output)")
|
| 120 |
|
| 121 |
args = parser.parse_args()
|
| 122 |
|
| 123 |
-
#
|
| 124 |
-
upload_directory_once(args.upload_dir, args.server, args.api_key, args.space_id)
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import asyncio
|
| 2 |
+
import websockets
|
| 3 |
+
import json
|
| 4 |
+
import logging
|
| 5 |
+
import sys
|
| 6 |
+
import base64
|
| 7 |
import os
|
| 8 |
+
import argparse
|
| 9 |
+
|
| 10 |
+
# 配置日志
|
| 11 |
+
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
| 12 |
+
logger = logging.getLogger(__name__)
|
| 13 |
|
| 14 |
+
class WebSocketFileUploader:
|
| 15 |
def __init__(self, server_url, api_key, space_id):
|
| 16 |
+
# 将HTTP URL转换为WebSocket URL
|
| 17 |
+
if server_url.startswith('http://'):
|
| 18 |
+
self.ws_url = server_url.replace('http://', 'ws://') + '/ws/upload'
|
| 19 |
+
elif server_url.startswith('https://'):
|
| 20 |
+
self.ws_url = server_url.replace('https://', 'wss://') + '/ws/upload'
|
| 21 |
+
else:
|
| 22 |
+
self.ws_url = f"ws://{server_url}/ws/upload"
|
| 23 |
+
|
| 24 |
self.api_key = api_key
|
| 25 |
self.space_id = space_id
|
| 26 |
|
| 27 |
+
async def upload_file(self, file_path):
|
| 28 |
+
"""使用WebSocket上传单个文件"""
|
| 29 |
if not os.path.exists(file_path):
|
| 30 |
print(f"文件不存在: {file_path}")
|
| 31 |
return False
|
|
|
|
| 33 |
filename = os.path.basename(file_path)
|
| 34 |
print(f"正在上传文件: {filename}")
|
| 35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
try:
|
| 37 |
+
# 读取文件内容并编码为base64
|
| 38 |
with open(file_path, 'rb') as f:
|
| 39 |
+
file_content = f.read()
|
| 40 |
+
file_b64 = base64.b64encode(file_content).decode('utf-8')
|
| 41 |
+
|
| 42 |
+
# 连接到WebSocket服务器
|
| 43 |
+
async with websockets.connect(self.ws_url) as websocket:
|
| 44 |
+
# 发送认证和文件数据
|
| 45 |
+
upload_msg = {
|
| 46 |
+
"type": "file_upload",
|
| 47 |
+
"api_key": self.api_key,
|
| 48 |
+
"space_id": self.space_id,
|
| 49 |
+
"filename": filename,
|
| 50 |
+
"content": file_b64
|
| 51 |
}
|
| 52 |
|
| 53 |
+
await websocket.send(json.dumps(upload_msg))
|
| 54 |
+
logger.debug(f"发送文件上传请求: {filename}")
|
| 55 |
+
|
| 56 |
+
# 等待服务器响应
|
| 57 |
+
response = await websocket.recv()
|
| 58 |
+
data = json.loads(response)
|
| 59 |
|
| 60 |
+
if data.get("type") == "success":
|
| 61 |
+
print(f"✅ 文件 '{filename}' 上传成功!")
|
| 62 |
+
return True
|
| 63 |
+
else:
|
| 64 |
+
print(f"❌ 上传失败: {data.get('error', '未知错误')}")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
return False
|
| 66 |
|
| 67 |
+
except Exception as e:
|
| 68 |
+
print(f"上传文件 {filename} 时出错: {e}")
|
|
|
|
|
|
|
|
|
|
| 69 |
return False
|
| 70 |
|
| 71 |
+
async def upload_directory_once(upload_dir, server_url, api_key, space_id):
|
| 72 |
"""一次性扫描并上传目录中的所有文件"""
|
| 73 |
+
if not os.path.exists(upload_dir):
|
| 74 |
+
print(f"目录不存在: {upload_dir}")
|
| 75 |
return
|
| 76 |
|
| 77 |
+
print(f"🔍 开始扫描目录: {upload_dir}")
|
| 78 |
print(f"📡 服务器地址: {server_url}")
|
| 79 |
print(f"🔑 Space ID: {space_id}")
|
| 80 |
print("-" * 50)
|
| 81 |
|
| 82 |
+
uploader = WebSocketFileUploader(server_url, api_key, space_id)
|
| 83 |
|
| 84 |
# 获取所有文件
|
| 85 |
all_files = []
|
| 86 |
+
for root, dirs, files in os.walk(upload_dir):
|
| 87 |
for file in files:
|
| 88 |
file_path = os.path.join(root, file)
|
| 89 |
if os.path.isfile(file_path):
|
|
|
|
| 100 |
|
| 101 |
for file_path in all_files:
|
| 102 |
try:
|
| 103 |
+
if await uploader.upload_file(file_path):
|
| 104 |
success_count += 1
|
| 105 |
else:
|
| 106 |
failed_count += 1
|
| 107 |
# 稍微延迟一下,避免服务器压力过大
|
| 108 |
+
await asyncio.sleep(0.5)
|
| 109 |
except Exception as e:
|
| 110 |
print(f"上传文件 {file_path} 时发生异常: {e}")
|
| 111 |
failed_count += 1
|
|
|
|
| 118 |
|
| 119 |
return success_count, failed_count
|
| 120 |
|
| 121 |
+
async def main():
|
| 122 |
+
parser = argparse.ArgumentParser(description="WebSocket文件上传器 - 扫描并上传指定文件夹中的所有文件")
|
| 123 |
parser.add_argument("api_key", help="您的 API 密钥")
|
| 124 |
parser.add_argument("space_id", help="Space ID")
|
| 125 |
+
parser.add_argument("--server", default="https://gkbtyo-rqvays-5001.preview.cloudstudio.work", help="服务器的 URL 地址")
|
| 126 |
parser.add_argument("--upload-dir", default="output", help="要上传的目录 (默认: output)")
|
| 127 |
|
| 128 |
args = parser.parse_args()
|
| 129 |
|
| 130 |
+
# 开始上传
|
| 131 |
+
await upload_directory_once(args.upload_dir, args.server, args.api_key, args.space_id)
|
| 132 |
+
|
| 133 |
+
if __name__ == "__main__":
|
| 134 |
+
asyncio.run(main())
|