Starchik1 commited on
Commit
b86f530
·
verified ·
1 Parent(s): be00d02

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +65 -23
main.py CHANGED
@@ -1,8 +1,9 @@
1
  from flask import Flask, request, jsonify, Response
2
  import random
3
  import string
4
- from collections import deque
5
  import threading
 
 
6
 
7
  app = Flask(__name__)
8
 
@@ -10,6 +11,27 @@ transfers = {}
10
  transfer_data = {}
11
  transfer_lock = threading.Lock()
12
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  def generate_short_id(length=4):
14
  while True:
15
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
@@ -18,50 +40,70 @@ def generate_short_id(length=4):
18
 
19
  @app.route('/create_transfer', methods=['POST'])
20
  def create_transfer():
21
- filename = request.json.get('filename')
22
- filesize = request.json.get('filesize', 0)
23
 
24
- transfer_id = generate_short_id(4)
25
  with transfer_lock:
26
  transfers[transfer_id] = {
27
- 'filename': filename,
28
- 'filesize': filesize,
29
- 'completed': False
 
 
30
  }
31
- transfer_data[transfer_id] = deque()
 
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].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=5000)
 
1
  from flask import Flask, request, jsonify, Response
2
  import random
3
  import string
 
4
  import threading
5
+ import time
6
+ from datetime import datetime, timedelta
7
 
8
  app = Flask(__name__)
9
 
 
11
  transfer_data = {}
12
  transfer_lock = threading.Lock()
13
 
14
+ # Настройки хранения данных
15
+ TRANSFER_LIFETIME = timedelta(hours=1) # Время хранения завершенных передач
16
+ CLEANUP_INTERVAL = 3600 # 5 минут в секундах
17
+
18
+ def cleanup_task():
19
+ """Фоновая задача для очистки старых передач"""
20
+ while True:
21
+ time.sleep(CLEANUP_INTERVAL)
22
+ with transfer_lock:
23
+ now = datetime.now()
24
+ to_delete = []
25
+ for transfer_id, info in transfers.items():
26
+ if info['completed'] and (now - info['completed_time']) > TRANSFER_LIFETIME:
27
+ to_delete.append(transfer_id)
28
+
29
+ for transfer_id in to_delete:
30
+ del transfers[transfer_id]
31
+ del transfer_data[transfer_id]
32
+
33
+ threading.Thread(target=cleanup_task, daemon=True).start()
34
+
35
  def generate_short_id(length=4):
36
  while True:
37
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
 
40
 
41
  @app.route('/create_transfer', methods=['POST'])
42
  def create_transfer():
43
+ data = request.json
44
+ transfer_id = generate_short_id()
45
 
 
46
  with transfer_lock:
47
  transfers[transfer_id] = {
48
+ 'filename': data['filename'],
49
+ 'filesize': data.get('filesize', 0),
50
+ 'completed': False,
51
+ 'created_time': datetime.now(),
52
+ 'completed_time': None
53
  }
54
+ transfer_data[transfer_id] = []
55
+
56
  return jsonify({'transfer_id': transfer_id})
57
 
58
  @app.route('/upload/<transfer_id>', methods=['POST'])
59
+ def upload_chunk(transfer_id):
60
  if transfer_id not in transfers:
61
  return jsonify({'error': 'Invalid transfer ID'}), 404
62
+
63
+ chunk = request.data
64
  with transfer_lock:
65
+ transfer_data[transfer_id].append(chunk)
66
+
67
+ if request.headers.get('X-Transfer-Complete') == 'true':
68
+ transfers[transfer_id]['completed'] = True
69
+ transfers[transfer_id]['completed_time'] = datetime.now()
70
 
71
+ return jsonify({'status': 'chunk accepted'})
72
 
73
  @app.route('/download/<transfer_id>', methods=['GET'])
74
  def download_file(transfer_id):
 
 
 
75
  def generate():
76
+ index = 0
77
  while True:
78
  with transfer_lock:
79
+ transfer = transfers.get(transfer_id)
80
+ if not transfer:
81
+ break
82
+
83
+ chunks = transfer_data.get(transfer_id, [])
84
+
85
+ # Отправляем все новые чанки
86
+ while index < len(chunks):
87
+ yield chunks[index]
88
+ index += 1
89
+
90
+ # Проверяем завершение передачи
91
+ if transfer['completed']:
92
  break
93
+
94
+ time.sleep(1) # Ожидание новых чанков
95
+
96
+ if transfer_id not in transfers:
97
+ return jsonify({'error': 'Transfer not found'}), 404
98
 
99
  return Response(
100
  generate(),
101
  mimetype='application/octet-stream',
102
+ headers={
103
+ 'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"',
104
+ 'Transfer-Encoding': 'chunked'
105
+ }
106
  )
107
 
108
  if __name__ == '__main__':
109
+ app.run(host='0.0.0.0', port=5000, threaded=True)