Starchik1 commited on
Commit
0491fc6
·
verified ·
1 Parent(s): 3d7b0be

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +48 -45
main.py CHANGED
@@ -1,64 +1,67 @@
1
- from flask import Flask, request, jsonify
2
  import random
3
  import string
 
 
4
 
5
  app = Flask(__name__)
6
 
7
- # В памяти храним зарегистрированных пользователей и сессии передачи файлов
8
- users = {}
9
  transfers = {}
 
 
10
 
11
  def generate_short_id(length=8):
12
- """
13
- Генерирует короткий уникальный идентификатор для передачи файла.
14
- """
15
  while True:
16
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
17
  if token not in transfers:
18
  return token
19
 
20
- @app.route('/register', methods=['POST'])
21
- def register():
22
- data = request.json
23
- username = data.get('username')
24
- password = data.get('password')
25
- if not username or not password:
26
- return jsonify({'error': 'Не переданы обязательные поля'}), 400
27
- if username in users:
28
- return jsonify({'error': 'Пользователь уже существует'}), 400
29
- users[username] = {'password': password}
30
- return jsonify({'message': 'Регистрация прошла успешно'})
31
-
32
  @app.route('/create_transfer', methods=['POST'])
33
  def create_transfer():
34
- data = request.json
35
- filename = data.get('filename')
36
- ip = data.get('ip')
37
- port = data.get('port')
38
- filesize = data.get('filesize', 0)
39
- if not filename or not ip or not port:
40
- return jsonify({'error': 'Отсутствуют необходимые параметры'}), 400
41
-
42
- # Используем короткий идентификатор для передачи файла
43
  transfer_id = generate_short_id(8)
44
- transfers[transfer_id] = {
45
- 'filename': filename,
46
- 'ip': ip,
47
- 'port': port,
48
- 'filesize': filesize,
49
- 'downloaded': False
50
- }
51
- # Формируем короткую ссылку для скачивания (маршрут изменён на /d/)
52
- download_link = request.host_url + 'd/' + transfer_id
53
- return jsonify({'download_link': download_link})
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
 
55
- @app.route('/d/<transfer_id>', methods=['GET'])
56
- def get_transfer(transfer_id):
57
- transfer = transfers.get(transfer_id)
58
- if not transfer:
59
- return jsonify({'error': 'Неверный идентификатор передачи'}), 404
60
- return jsonify(transfer)
61
 
62
  if __name__ == '__main__':
63
- # Запускаем сервер на всех интерфейсах на порту 5000
64
- app.run(host='0.0.0.0', port=7860)
 
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
 
 
 
9
  transfers = {}
10
+ transfer_data = {}
11
+ transfer_lock = threading.Lock()
12
 
13
  def generate_short_id(length=8):
 
 
 
14
  while True:
15
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
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')
22
+ filesize = request.json.get('filesize', 0)
23
+
 
 
 
 
 
 
24
  transfer_id = generate_short_id(8)
25
+ with transfer_lock:
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)