Starchik1 commited on
Commit
daa26e9
·
verified ·
1 Parent(s): ae24aac

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +24 -76
main.py CHANGED
@@ -1,22 +1,16 @@
1
  from flask import Flask, request, jsonify, Response
2
  import random
3
  import string
 
4
  import threading
5
- import time
6
- import os
7
- from pathlib import Path
8
 
9
  app = Flask(__name__)
10
- app.config['MAX_CONTENT_LENGTH'] = 12 * 1024 * 1024 * 1024 # 12GB
11
- UPLOAD_FOLDER = Path('uploads')
12
- UPLOAD_FOLDER.mkdir(exist_ok=True)
13
 
14
  transfers = {}
 
15
  transfer_lock = threading.Lock()
16
- TIMEOUT = 3600 # 1 час
17
- CHUNK_SIZE = 1024 * 1024 # 1MB
18
 
19
- def generate_short_id(length=10):
20
  while True:
21
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
22
  if token not in transfers:
@@ -27,68 +21,41 @@ def create_transfer():
27
  filename = request.json.get('filename')
28
  filesize = request.json.get('filesize', 0)
29
 
30
- transfer_id = generate_short_id()
31
- file_path = UPLOAD_FOLDER / f"{transfer_id}.dat"
32
-
33
  with transfer_lock:
34
  transfers[transfer_id] = {
35
  'filename': filename,
36
  'filesize': filesize,
37
- 'completed': False,
38
- 'last_activity': time.time(),
39
- 'file_path': file_path,
40
- 'file_handle': open(file_path, 'wb')
41
  }
42
-
43
  return jsonify({'transfer_id': transfer_id})
44
 
45
  @app.route('/upload/<transfer_id>', methods=['POST'])
46
  def upload_file(transfer_id):
 
 
 
 
47
  with transfer_lock:
48
- if transfer_id not in transfers:
49
- return jsonify({'error': 'Invalid transfer ID'}), 404
50
-
51
- transfer = transfers[transfer_id]
52
- transfer['last_activity'] = time.time()
53
-
54
- try:
55
- # Записываем полученные данные в файл
56
- data = request.data
57
- transfer['file_handle'].write(data)
58
- transfer['file_handle'].flush()
59
-
60
- if request.headers.get('X-Transfer-Complete') == 'true':
61
- transfer['completed'] = True
62
- transfer['file_handle'].close()
63
-
64
- return jsonify({'status': 'chunk uploaded', 'received': len(data)})
65
-
66
- except Exception as e:
67
- return jsonify({'error': str(e)}), 500
68
 
69
  @app.route('/download/<transfer_id>', methods=['GET'])
70
  def download_file(transfer_id):
 
 
 
71
  def generate():
72
- file_path = None
73
- with transfer_lock:
74
- if transfer_id not in transfers:
75
- yield b'Transfer expired'
76
- return
77
-
78
- transfer = transfers[transfer_id]
79
- file_path = transfer['file_path']
80
- transfer['last_activity'] = time.time()
81
-
82
- if not file_path.exists():
83
- yield b'File not found'
84
- return
85
-
86
- with open(file_path, 'rb') as f:
87
- while True:
88
- chunk = f.read(CHUNK_SIZE)
89
- if not chunk:
90
  break
91
- yield chunk
92
 
93
  return Response(
94
  generate(),
@@ -96,24 +63,5 @@ def download_file(transfer_id):
96
  headers={'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"'}
97
  )
98
 
99
- def cleanup_thread():
100
- while True:
101
- time.sleep(60 * 5) # Проверка каждые 5 минут
102
- with transfer_lock:
103
- now = time.time()
104
- expired = []
105
- for tid, t in transfers.items():
106
- if now - t['last_activity'] > TIMEOUT:
107
- expired.append(tid)
108
- if 'file_handle' in t and not t['file_handle'].closed:
109
- t['file_handle'].close()
110
- if t['file_path'].exists():
111
- t['file_path'].unlink()
112
-
113
- for tid in expired:
114
- del transfers[tid]
115
-
116
- threading.Thread(target=cleanup_thread, daemon=True).start()
117
-
118
  if __name__ == '__main__':
119
- app.run(host='0.0.0.0', port=5000, threaded=True)
 
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:
 
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()
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(),
 
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)