From 775adc6d57378b7577ab402d3bcebfe0c9f6db3d Mon Sep 17 00:00:00 2001 From: crunk Date: Sat, 16 Nov 2024 09:47:07 +0100 Subject: [PATCH] tux me up --- static/content/glit_background.gif | Bin 0 -> 4254 bytes static/content/prompt.wav | Bin 0 -> 34796 bytes templates/upload.html | 20 ++++++++++++++ upload.py | 43 +++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 static/content/glit_background.gif create mode 100644 static/content/prompt.wav create mode 100644 templates/upload.html create mode 100644 upload.py diff --git a/static/content/glit_background.gif b/static/content/glit_background.gif new file mode 100644 index 0000000000000000000000000000000000000000..5124017456e0072b2387797c9802e2b836c899ac GIT binary patch literal 4254 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 DId(~1 literal 0 HcmV?d00001 diff --git a/templates/upload.html b/templates/upload.html new file mode 100644 index 0000000..fcacef4 --- /dev/null +++ b/templates/upload.html @@ -0,0 +1,20 @@ + + + + + + Perma-Upload a picture + + +
+ {{ imageuploadform.csrf_token }} +
+ {{ imageuploadform.image.label }} + {{ imageuploadform.image }} + {% for message in imageuploadform.image.errors %} +
{{ message }}
+ {% endfor %} +
+ {{ imageuploadform.submit }} +
+ diff --git a/upload.py b/upload.py new file mode 100644 index 0000000..dc6439c --- /dev/null +++ b/upload.py @@ -0,0 +1,43 @@ +import os +from flask import Flask, render_template, redirect, request +from flask_wtf import FlaskForm +from flask_wtf.file import FileAllowed, FileField +from wtforms import ( + SubmitField, +) + +# config me here +APP = Flask(__name__, static_folder="static") +APP.config["IMAGE_FOLDER"] = "static/images" +ALLOWED_FILES = ["jpg", "png", "gif", "webp"] + +# don't config these lines +APP.config["SECRET_KEY"] = os.urandom(24) + +class ImageUploadForm(FlaskForm): + """Image upload form.""" + image = FileField( + "Upload an image:", + validators=[FileAllowed(ALLOWED_FILES, "Images only!")], + ) + submit = SubmitField("Submit") + + +def saveimage(image): + """Save the image to the folder""" + image.save(os.path.join(APP.config["IMAGE_FOLDER"], image.filename)) + + +@APP.route("/", methods=["GET", "POST"]) +def index(): + """Upload route, a page to upload an image""" + imageuploadform = ImageUploadForm() + if request.method == "POST": + if imageuploadform.validate_on_submit(): + saveimage(imageuploadform.image.data) + return render_template("upload.html", imageuploadform=imageuploadform) + + +if __name__ == "__main__": + APP.debug = True + APP.run(port=5000)