Spaces:
Runtime error
Runtime error
File size: 6,682 Bytes
86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe 9d9567e 86913fe |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
import requests
import argparse
import os
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class FileUploadHandler(FileSystemEventHandler):
def __init__(self, server_url, api_key, space_id):
self.server_url = server_url
self.api_key = api_key
self.space_id = space_id
self.uploaded_files = set() # 跟踪已上传的文件
def send_log(self, message):
"""发送日志到服务器"""
try:
log_url = f"{self.server_url.rstrip('/')}/api/remote_log"
headers = {
'X-API-Key': self.api_key,
'Content-Type': 'application/json'
}
data = {
'space_id': self.space_id,
'message': message,
'timestamp': time.time()
}
response = requests.post(log_url, headers=headers, json=data, timeout=5)
if response.status_code != 200:
print(f"发送日志失败: {response.status_code}")
except Exception as e:
print(f"发送日志异常: {e}")
def on_created(self, event):
"""当新文件被创建时触发"""
if not event.is_directory:
# 等待一段时间确保文件写入完成
time.sleep(1)
self.upload_file(event.src_path)
def on_modified(self, event):
"""当文件被修改时触发"""
if not event.is_directory:
# 等待一段时间确保文件写入完成
time.sleep(1)
self.upload_file(event.src_path)
def upload_file(self, file_path):
"""上传单个文件"""
if not os.path.exists(file_path):
message = f"文件不存在: {file_path}"
print(message)
self.send_log(message)
return
filename = os.path.basename(file_path)
# 避免重复上传同一个文件
if file_path in self.uploaded_files:
return
message = f"检测到新文件: {filename}"
print(message)
self.send_log(message)
message = f"正在上传到服务器..."
print(message)
self.send_log(message)
# 构建完整的 API 端点 URL
upload_url = f"{self.server_url.rstrip('/')}/api/remote_upload"
# 准备请求头和数据
headers = {
'X-API-Key': self.api_key
}
data = {
'space_id': self.space_id
}
# 读取文件内容并上传
try:
with open(file_path, 'rb') as f:
files = {
'file': (filename, f)
}
# 发送 POST 请求
response = requests.post(upload_url, headers=headers, data=data, files=files)
# 打印服务器响应
message = f"服务器响应 ({response.status_code}):"
print(message)
self.send_log(message)
try:
result = response.json()
print(result)
self.send_log(str(result))
if response.status_code == 200:
self.uploaded_files.add(file_path)
success_msg = f"✅ 文件 '{filename}' 上传成功!"
print(success_msg)
self.send_log(success_msg)
else:
error_msg = f"❌ 上传失败: {result.get('error', '未知错误')}"
print(error_msg)
self.send_log(error_msg)
except requests.exceptions.JSONDecodeError:
print(response.text)
self.send_log(response.text)
except IOError as e:
error_msg = f"读取文件时出错: {e}"
print(error_msg)
self.send_log(error_msg)
except requests.exceptions.RequestException as e:
error_msg = f"请求时出错: {e}"
print(error_msg)
self.send_log(error_msg)
def monitor_directory(watch_dir, server_url, api_key, space_id):
"""监听目录变化"""
if not os.path.exists(watch_dir):
print(f"创建监听目录: {watch_dir}")
os.makedirs(watch_dir, exist_ok=True)
handler = FileUploadHandler(server_url, api_key, space_id)
start_msg = f"🔍 开始监听目录: {watch_dir}"
print(start_msg)
handler.send_log(start_msg)
server_msg = f"📡 服务器地址: {server_url}"
print(server_msg)
handler.send_log(server_msg)
space_msg = f"🔑 Space ID: {space_id}"
print(space_msg)
handler.send_log(space_msg)
wait_msg = "等待新文件..."
print(wait_msg)
handler.send_log(wait_msg)
print("-" * 50)
handler.send_log("-" * 50)
# 首先上传目录中已存在的文件
existing_files = [f for f in os.listdir(watch_dir) if os.path.isfile(os.path.join(watch_dir, f))]
if existing_files:
existing_msg = f"发现 {len(existing_files)} 个已存在的文件,开始上传..."
print(existing_msg)
handler.send_log(existing_msg)
for filename in existing_files:
file_path = os.path.join(watch_dir, filename)
handler.upload_file(file_path)
print("-" * 50)
handler.send_log("-" * 50)
# 创建观察者并开始监听
observer = Observer()
observer.schedule(handler, watch_dir, recursive=False)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
stop_msg = "\n停止监听..."
print(stop_msg)
handler.send_log(stop_msg)
observer.stop()
observer.join()
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="远程文件监听上传器 - 自动监听 output 文件夹并上传新文件")
parser.add_argument("api_key", help="您的 API 密钥")
parser.add_argument("space_id", help="Space ID")
parser.add_argument("--server", default="http://127.0.0.1:5001", help="服务器的 URL 地址 (默认: http://127.0.0.1:5001)")
parser.add_argument("--watch-dir", default="output", help="要监听的目录 (默认: output)")
args = parser.parse_args()
# 开始监听目录
monitor_directory(args.watch_dir, args.server, args.api_key, args.space_id) |