File size: 2,075 Bytes
0491fc6 33f8f7c daa26e9 0491fc6 059bbb9 07d1566 daa26e9 0491fc6 059bbb9 daa26e9 33f8f7c 07d1566 0491fc6 daa26e9 0491fc6 daa26e9 0491fc6 daa26e9 0491fc6 daa26e9 0491fc6 daa26e9 0491fc6 daa26e9 0491fc6 daa26e9 0491fc6 07d1566 0491fc6 217266f 0491fc6 059bbb9 ae24aac daa26e9 |
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=5000) |