Starchik1 commited on
Commit
217266f
·
verified ·
1 Parent(s): 56921b4

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +16 -57
main.py CHANGED
@@ -3,14 +3,12 @@ import random
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,21 +16,6 @@ def generate_short_id(length=8):
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,8 +26,6 @@ def create_transfer():
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()
@@ -52,57 +33,35 @@ def create_transfer():
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)
 
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
  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
  transfers[transfer_id] = {
27
  'filename': filename,
28
  'filesize': filesize,
 
 
29
  'completed': False
30
  }
31
  transfer_data[transfer_id] = deque()
 
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].append(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 = 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)