File size: 2,075 Bytes
0491fc6
33f8f7c
 
0491fc6
 
059bbb9
 
 
07d1566
0491fc6
 
059bbb9
33f8f7c
 
 
 
 
 
07d1566
 
0491fc6
 
 
33f8f7c
0491fc6
 
 
 
 
 
56921b4
0491fc6
 
 
 
217266f
 
 
 
0491fc6
217266f
 
 
 
0491fc6
 
 
217266f
 
 
0491fc6
 
 
217266f
 
0491fc6
217266f
0491fc6
07d1566
0491fc6
 
 
217266f
0491fc6
059bbb9
 
217266f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
from flask import Flask, request, jsonify, Response
import random
import string
from collections import deque
import threading

app = Flask(__name__)

transfers = {}
transfer_data = {}
transfer_lock = threading.Lock()

def generate_short_id(length=8):
    while True:
        token = ''.join(random.choices(string.ascii_letters + string.digits, k=length))
        if token not in transfers:
            return token

@app.route('/create_transfer', methods=['POST'])
def create_transfer():
    filename = request.json.get('filename')
    filesize = request.json.get('filesize', 0)
    
    transfer_id = generate_short_id(8)
    with transfer_lock:
        transfers[transfer_id] = {
            'filename': filename,
            'filesize': filesize,
            'completed': False
        }
        transfer_data[transfer_id] = deque()
    return jsonify({'transfer_id': transfer_id})

@app.route('/upload/<transfer_id>', methods=['POST'])
def upload_file(transfer_id):
    if transfer_id not in transfers:
        return jsonify({'error': 'Invalid transfer ID'}), 404
    
    data = request.data
    with transfer_lock:
        transfer_data[transfer_id].append(data)
        transfers[transfer_id]['completed'] = request.headers.get('X-Transfer-Complete') == 'true'
    
    return jsonify({'status': 'chunk uploaded'})

@app.route('/download/<transfer_id>', methods=['GET'])
def download_file(transfer_id):
    if transfer_id not in transfers:
        return jsonify({'error': 'Invalid transfer ID'}), 404

    def generate():
        while True:
            with transfer_lock:
                if transfer_data[transfer_id]:
                    chunk = transfer_data[transfer_id].popleft()
                    yield chunk
                elif transfers[transfer_id]['completed']:
                    break

    return Response(
        generate(),
        mimetype='application/octet-stream',
        headers={'Content-Disposition': f'attachment; filename="{transfers[transfer_id]["filename"]}"'}
    )

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=7860)