from flask import Flask, request, send_from_directory, jsonify, url_for, render_template import os from werkzeug.utils import secure_filename app = Flask(__name__) # Configuration UPLOAD_FOLDER = 'cdn_files' ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif', 'webp'} app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 500 * 1024 * 1024 # 16 MB limit per file # Ensure the upload folder exists os.makedirs(UPLOAD_FOLDER, exist_ok=True) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/') def upload_gui(): return render_template('upload.html') @app.route('/upload', methods=['POST']) def upload_files(): folder_name = request.form.get('folder_name') # Folder name from the client if not folder_name: return jsonify({'error': 'Folder name is required'}), 400 folder_name = secure_filename(folder_name) # Sanitize folder name folder_path = os.path.join(app.config['UPLOAD_FOLDER'], folder_name) os.makedirs(folder_path, exist_ok=True) # Create folder if it doesn't exist if 'files' not in request.files: return jsonify({'error': 'No file part'}), 400 files = request.files.getlist('files') if not files or all(file.filename == '' for file in files): return jsonify({'error': 'No selected files'}), 400 uploaded_files = [] for file in files: if file and allowed_file(file.filename): relative_path = secure_filename(file.filename) full_path = os.path.join(folder_path, relative_path) # Ensure directories in the relative path are created os.makedirs(os.path.dirname(full_path), exist_ok=True) file.save(full_path) file_url = url_for('serve_file', folder_name=folder_name, filename=relative_path, _external=True) uploaded_files.append({'filename': relative_path, 'url': file_url}) return jsonify({ 'message': 'Files uploaded successfully', 'folder_url': url_for('serve_folder', folder_name=folder_name, _external=True), 'files': uploaded_files }), 201 @app.route('/cdn//', methods=['GET']) def serve_file(folder_name, filename): folder_path = os.path.join(app.config['UPLOAD_FOLDER'], folder_name) try: return send_from_directory(folder_path, filename, as_attachment=False) except FileNotFoundError: return jsonify({'error': 'File not found'}), 404 @app.route('/cdn//', methods=['GET']) def serve_folder(folder_name): folder_path = os.path.join(app.config['UPLOAD_FOLDER'], folder_name) if not os.path.exists(folder_path): return jsonify({'error': 'Folder not found'}), 404 # List all files in the folder with their URLs file_urls = [] for root, _, files in os.walk(folder_path): for file in files: relative_path = os.path.relpath(os.path.join(root, file), folder_path) file_urls.append(url_for('serve_file', folder_name=folder_name, filename=relative_path, _external=True)) return jsonify({ 'message': 'Folder retrieved successfully', 'files': file_urls }) @app.after_request def add_cache_headers(response): # Add caching headers to serve files efficiently response.headers['Cache-Control'] = 'public, max-age=31536000' return response if __name__ == '__main__': port = int(os.environ.get('PORT', 5000)) app.run(host='0.0.0.0', port=port, debug=True)