Python Flask Upload File and validate before save to Database using SQLAlchemy
Validate extension file before save to database
#app.py from flask import Flask, render_template, flash, redirect, url_for, request from flask_sqlalchemy import SQLAlchemy from werkzeug.utils import secure_filename import os #import magic import urllib.request app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db' app.config['SECRET_KEY'] = 'cairocoders-ednalan' UPLOAD_FOLDER = 'C:/flaskmyproject/demoapp/static' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(120), index=True, unique=True) email = db.Column(db.String(120), index=True, unique=True) profile_pic = db.Column(db.String(150)) @app.route('/') def index(): return render_template('index.html') @app.route('/upload', methods=['POST']) def upload(): file = request.files['inputFile'] rs_username = request.form['txtusername'] filename = secure_filename(file.filename) if file and allowed_file(file.filename): file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) newFile = User(profile_pic=file.filename, username=rs_username, email='Ednalan@gmail.com') db.session.add(newFile) db.session.commit() flash('File successfully uploaded ' + file.filename + ' to the database!') return redirect('/') else: flash('Invalid Uplaod only txt, pdf, png, jpg, jpeg, gif') return redirect('/') if __name__ == '__main__': app.run(debug=True)
//templates/index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Python Flask Upload File and validate before save to Database using SQLAlchemy </title> </head> <body> <h2>Python Flask Upload File and validate before save to Database using SQLAlchemy </h2> <h3>Select a file to upload</h3> <p> {% with messages = get_flashed_messages() %} {% if messages %} {% for message in messages %} <div class="alert alert-primary"> <strong>{{ message }}</strong> </div> {% endfor %} {% endif %} {% endwith %} </p> <form method="post" action="/upload" enctype="multipart/form-data"> <input type="text" name="txtusername" value="" placeholder="User Name" required> <dl> <p> <input type="file" name="inputFile" autocomplete="off" required> </p> </dl> <p> <input type="submit" value="Submit"> </p> </form> <style> .alert-primary { color: #004085; background-color: #cce5ff; border-color: #b8daff; } .alert { position: relative; padding: .75rem 1.25rem; margin-bottom: 1rem; border: 1px solid transparent; border-radius: .25rem; } </style> </body> </html>