File size: 4,752 Bytes
76f2695
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
# remote_uploader.py
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 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):
            print(f"文件不存在: {file_path}")
            return
        
        filename = os.path.basename(file_path)
        
        # 避免重复上传同一个文件
        if file_path in self.uploaded_files:
            return
            
        print(f"检测到新文件: {filename}")
        print(f"正在上传到服务器...")
        
        # 构建完整的 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)
                
                # 打印服务器响应
                print(f"服务器响应 ({response.status_code}):")
                try:
                    result = response.json()
                    print(result)
                    if response.status_code == 200:
                        self.uploaded_files.add(file_path)
                        print(f"✅ 文件 '{filename}' 上传成功!")
                    else:
                        print(f"❌ 上传失败: {result.get('error', '未知错误')}")
                except requests.exceptions.JSONDecodeError:
                    print(response.text)
                    
        except IOError as e:
            print(f"读取文件时出错: {e}")
        except requests.exceptions.RequestException as e:
            print(f"请求时出错: {e}")

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)
    
    print(f"🔍 开始监听目录: {watch_dir}")
    print(f"📡 服务器地址: {server_url}")
    print(f"🔑 Space ID: {space_id}")
    print("等待新文件...")
    print("-" * 50)
    
    # 首先上传目录中已存在的文件
    handler = FileUploadHandler(server_url, api_key, space_id)
    existing_files = [f for f in os.listdir(watch_dir) if os.path.isfile(os.path.join(watch_dir, f))]
    if existing_files:
        print(f"发现 {len(existing_files)} 个已存在的文件,开始上传...")
        for filename in existing_files:
            file_path = os.path.join(watch_dir, filename)
            handler.upload_file(file_path)
        print("-" * 50)
    
    # 创建观察者并开始监听
    observer = Observer()
    observer.schedule(handler, watch_dir, recursive=False)
    observer.start()
    
    try:
        while True:
            time.sleep(1)
    except KeyboardInterrupt:
        print("\n停止监听...")
        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)