Starchik1 commited on
Commit
5c18c00
·
verified ·
1 Parent(s): b343923

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +76 -25
main.py CHANGED
@@ -1,16 +1,22 @@
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=4):
14
  while True:
15
  token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
16
  if token not in transfers:
@@ -21,41 +27,68 @@ 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(),
@@ -63,5 +96,23 @@ def download_file(transfer_id):
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)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
  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
  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__':