Starchik1 commited on
Commit
56921b4
·
verified ·
1 Parent(s): 0491fc6

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +58 -17
main.py CHANGED
@@ -3,12 +3,14 @@ import random
3
  import string
4
  from collections import deque
5
  import threading
 
6
 
7
  app = Flask(__name__)
8
 
9
  transfers = {}
10
  transfer_data = {}
11
  transfer_lock = threading.Lock()
 
12
 
13
  def generate_short_id(length=8):
14
  while True:
@@ -16,6 +18,21 @@ def generate_short_id(length=8):
16
  if token not in transfers:
17
  return token
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  @app.route('/create_transfer', methods=['POST'])
20
  def create_transfer():
21
  filename = request.json.get('filename')
@@ -26,42 +43,66 @@ def create_transfer():
26
  transfers[transfer_id] = {
27
  'filename': filename,
28
  'filesize': filesize,
 
 
29
  'completed': False
30
  }
31
- transfer_data[transfer_id] = deque(maxlen=100) # Ограничение буфера
32
  return jsonify({'transfer_id': transfer_id})
33
 
34
  @app.route('/upload/<transfer_id>', methods=['POST'])
35
  def upload_file(transfer_id):
36
- if transfer_id not in transfers:
37
- return jsonify({'error': 'Invalid transfer ID'}), 404
38
-
39
- data = request.data
40
  with transfer_lock:
41
- transfer_data[transfer_id].extend(data)
42
- transfers[transfer_id]['completed'] = request.headers.get('X-Transfer-Complete') == 'true'
43
-
44
- return jsonify({'status': 'chunk uploaded'})
 
 
 
 
 
 
 
 
 
45
 
46
  @app.route('/download/<transfer_id>', methods=['GET'])
47
  def download_file(transfer_id):
48
- if transfer_id not in transfers:
49
- return jsonify({'error': 'Invalid transfer ID'}), 404
50
-
51
  def generate():
 
 
 
 
 
 
 
 
52
  while True:
53
  with transfer_lock:
54
- if transfer_data[transfer_id]:
55
- chunk = bytes(transfer_data[transfer_id].popleft())
56
  yield chunk
57
- elif transfers[transfer_id]['completed']:
58
  break
 
 
 
 
 
59
 
 
 
 
60
  return Response(
61
  generate(),
62
  mimetype='application/octet-stream',
63
- headers={'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"'}
 
 
 
64
  )
65
 
66
  if __name__ == '__main__':
67
- app.run(host='0.0.0.0', port=7860)
 
 
3
  import string
4
  from collections import deque
5
  import threading
6
+ from datetime import datetime, timedelta
7
 
8
  app = Flask(__name__)
9
 
10
  transfers = {}
11
  transfer_data = {}
12
  transfer_lock = threading.Lock()
13
+ CLEANUP_INTERVAL = 300 # 5 минут
14
 
15
  def generate_short_id(length=8):
16
  while True:
 
18
  if token not in transfers:
19
  return token
20
 
21
+ def cleanup_old_transfers():
22
+ while True:
23
+ now = datetime.now()
24
+ with transfer_lock:
25
+ to_delete = []
26
+ for transfer_id, data in transfers.items():
27
+ if now - data['last_activity'] > timedelta(seconds=CLEANUP_INTERVAL):
28
+ to_delete.append(transfer_id)
29
+
30
+ for transfer_id in to_delete:
31
+ del transfers[transfer_id]
32
+ del transfer_data[transfer_id]
33
+
34
+ threading.Event().wait(CLEANUP_INTERVAL)
35
+
36
  @app.route('/create_transfer', methods=['POST'])
37
  def create_transfer():
38
  filename = request.json.get('filename')
 
43
  transfers[transfer_id] = {
44
  'filename': filename,
45
  'filesize': filesize,
46
+ 'created': datetime.now(),
47
+ 'last_activity': datetime.now(),
48
  'completed': False
49
  }
50
+ transfer_data[transfer_id] = deque()
51
  return jsonify({'transfer_id': transfer_id})
52
 
53
  @app.route('/upload/<transfer_id>', methods=['POST'])
54
  def upload_file(transfer_id):
 
 
 
 
55
  with transfer_lock:
56
+ if transfer_id not in transfers:
57
+ return jsonify({'error': 'Invalid transfer ID'}), 404
58
+
59
+ transfers[transfer_id]['last_activity'] = datetime.now()
60
+
61
+ data = request.data
62
+ if data:
63
+ transfer_data[transfer_id].append(data)
64
+
65
+ if request.headers.get('X-Transfer-Complete') == 'true':
66
+ transfers[transfer_id]['completed'] = True
67
+
68
+ return jsonify({'status': 'OK', 'received': len(data)})
69
 
70
  @app.route('/download/<transfer_id>', methods=['GET'])
71
  def download_file(transfer_id):
 
 
 
72
  def generate():
73
+ with transfer_lock:
74
+ if transfer_id not in transfers:
75
+ return
76
+
77
+ transfers[transfer_id]['last_activity'] = datetime.now()
78
+ transfer = transfers[transfer_id]
79
+ data_queue = transfer_data[transfer_id]
80
+
81
  while True:
82
  with transfer_lock:
83
+ if data_queue:
84
+ chunk = bytes(data_queue.popleft())
85
  yield chunk
86
+ elif transfer['completed']:
87
  break
88
+ else:
89
+ # Ждем новые данные
90
+ pass
91
+
92
+ threading.Event().wait(0.1)
93
 
94
+ if transfer_id not in transfers:
95
+ return jsonify({'error': 'Invalid transfer ID'}), 404
96
+
97
  return Response(
98
  generate(),
99
  mimetype='application/octet-stream',
100
+ headers={
101
+ 'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
102
+ 'Content-Length': str(transfers[transfer_id]['filesize'])
103
+ }
104
  )
105
 
106
  if __name__ == '__main__':
107
+ threading.Thread(target=cleanup_old_transfers, daemon=True).start()
108
+ app.run(host='0.0.0.0', port=7860, threaded=True)