60 lines
2 KiB
Python
60 lines
2 KiB
Python
import os
|
|
import hashlib
|
|
from flask import Flask, render_template, request, redirect, flash, url_for
|
|
from werkzeug.middleware.proxy_fix import ProxyFix
|
|
|
|
app = Flask(__name__)
|
|
app.secret_key = os.getenv("SECRET_KEY")
|
|
BASE_URL = os.getenv("BASE_URL") # Adjust as appropriate for your deployment
|
|
|
|
app.wsgi_app = ProxyFix(
|
|
app.wsgi_app, x_for=1, x_proto=1, x_host=1, x_prefix=1
|
|
)
|
|
|
|
UPLOAD_FOLDER = os.getenv("UPLOAD_FOLDER")
|
|
os.makedirs(UPLOAD_FOLDER, exist_ok=True)
|
|
|
|
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
|
|
|
|
def allowed_file(filename):
|
|
return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
|
|
|
|
def get_file_hash(file_storage):
|
|
file_storage.seek(0)
|
|
sha = hashlib.sha256()
|
|
while True:
|
|
chunk = file_storage.read(4096)
|
|
if not chunk:
|
|
break
|
|
sha.update(chunk)
|
|
hash8 = sha.hexdigest()[:8]
|
|
file_storage.seek(0)
|
|
return hash8
|
|
|
|
@app.route('/', methods=['GET', 'POST'])
|
|
def upload_file():
|
|
uploaded_url = None
|
|
if request.method == 'POST':
|
|
if 'file' not in request.files:
|
|
flash('No file part', 'error')
|
|
return redirect(request.url)
|
|
file = request.files['file']
|
|
if file.filename == '':
|
|
flash('No selected file', 'error')
|
|
return redirect(request.url)
|
|
if file and allowed_file(file.filename):
|
|
hash8 = get_file_hash(file)
|
|
ext = file.filename.rsplit('.', 1)[1].lower()
|
|
filename = f"{hash8}.{ext}"
|
|
filepath = os.path.join(UPLOAD_FOLDER, filename)
|
|
file.save(filepath)
|
|
# Compose the URL (assuming files will eventually be hosted at /uploads/<filename>)
|
|
uploaded_url = f"{BASE_URL}/{filename}"
|
|
return render_template("index.html", uploaded_url=uploaded_url)
|
|
else:
|
|
flash('Invalid file extension', 'error')
|
|
return redirect(request.url)
|
|
return render_template("index.html", uploaded_url=uploaded_url)
|
|
|
|
if __name__ == '__main__':
|
|
app.run(debug=True)
|