File size: 2,075 Bytes
3205dff a460fdc 5bb5d81 146248c 059bbb9 0b67e3c 146248c 5bb5d81 059bbb9 be00d02 5bb5d81 33f8f7c 5bb5d81 3205dff 5bb5d81 3205dff be00d02 5bb5d81 a71ce8a 5bb5d81 3205dff 5bb5d81 3205dff 5bb5d81 3205dff 5bb5d81 146248c 5bb5d81 a71ce8a 5bb5d81 a71ce8a 5bb5d81 a71ce8a 059bbb9 0b67e3c 5bb5d81 |
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=4):
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(4)
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=5000) |