cdn-py / app.py
Keys
Fifth Commit
da7aec5
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/<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
# 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)