| from flask import Flask, request, send_from_directory, jsonify, url_for, render_template |
| import os |
| from werkzeug.utils import secure_filename |
|
|
| app = Flask(__name__) |
|
|
| |
| 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 |
|
|
| |
| 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') |
| if not folder_name: |
| return jsonify({'error': 'Folder name is required'}), 400 |
|
|
| folder_name = secure_filename(folder_name) |
| folder_path = os.path.join(app.config['UPLOAD_FOLDER'], folder_name) |
| os.makedirs(folder_path, exist_ok=True) |
|
|
| 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) |
|
|
| |
| 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/<folder_name>/<path:filename>', 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/<folder_name>/', 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 |
|
|
| |
| 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): |
| |
| 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) |
|
|