Cesco
Cesco

Il mio blog personale

Francesco
Author

Share


Tags


Come caricare un file sul server utilizzando flask-wtforms

FrancescoFrancesco

Ok, alla fine è stato un pochino più complicato di quello che mi aspettavo ma alla fine sono riuscito a capire come si può caricare un file sul server con flask e flask-wtforms

Questo è il codice in Python che fa funzionare il tutto:

import os

from werkzeug.utils import secure_filename  
from flask import Flask, render_template, request  
from flask_wtf import Form  
from wtforms import SubmitField  
from flask_wtf.file import FileField


app = Flask(__name__)

# E' importante impostare una parola chiave segreta per poter
# attivare la protezione di flask-wtforms dagli attacchi
# di tipo CRSF
app.config["SECRET_KEY"] = "Cinciallegra sbarabaus passava di qui"

# Imposto la cartella in cui verranno memorizzati i file uploadati
cartella_attuale = os.path.dirname(os.path.abspath(__file__))  
app.config['UPLOAD_FOLDER'] = os.path.join(cartella_attuale, "upload")


# Questa è la classe con la definizione del form da visualizzare
class FormUpload(Form):  
    allegato = FileField("Allegato da inviare")
    invia = SubmitField("Invia")


@app.route('/', methods=["POST", "GET"])
def index():  
    risposta = ""
    form = FormUpload(request.form)
    if form.validate_on_submit():
        # Se è stato inviato un file in allegato
        if form.allegato:
            # Preleva il file dal request
            file = request.files[form.allegato.name]
            # Si assicura che il nome del file caricato non
            # sia pericoloso per le infezioni XSS
            nomefile = secure_filename(file.filename)
            # Finalmente salva il file nel server
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], nomefile))
            # Prepara una stringa di testo per ringraziare
            risposta = "Grazie per aver inviato il file " + nomefile

    return render_template("index.html", form=form, risposta=risposta)


if __name__ == '__main__':  
    app.run(debug=True)

E questo è il codice HTML/Jinja2 per visualizzare la form:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">
    <title>Esempio di upload file</title>
</head>  
<body>

<form action="" method="post" enctype="multipart/form-data">  
    <!-- Questa riga è importante per abilitare -->
    <!-- la protezione dagli attacchi CSRF, ed inoltre -->
    <!-- senza questa riga flask non è in grado di leggere -->
    <!-- correttamente il contenuto della form -->
    {{ form.csrf_token }}

    <!-- Ora veniamo ai campi veri e propri -->
    {{ form.allegato.label }} {{ form.allegato | safe }}
    {{ form.invia() }}
</form>

<div id="risposta">  
    {{ risposta }}
</div>

</body>  
</html>  
Francesco
Author

Francesco

Comments