@app.route("/test_upload", methods=["GET", "POST"]) def test_upload(): # Si le formulaire a été posté if request.method == "POST": if request.files: fichier = request.files["fichier"] # ... faire quelque chose avec le fichier ... return redirect(request.url) # Sinon afficher le formulaire return render_template("upload.html")
Pour utiliser le fichier uploadé il faut l'enregistrer quelque part.
Définir une valeur dans la configuration. Le chemin doit être absolu. Il peut être en dehors de l'application.
Par exemple :
app.config['UPLOAD_PATH'] = "/home/marc/website/uploads"
Ensuite :
import os from werkzeug.utils import secure_filename filename = secure_filename(fichier.filename) fichier.save(os.path.join(app.config["UPLOAD_PATH"], filename))
fichier.filename | Nom original du fichier uploadé |
---|---|
fichier.save(path) | Enregistre le fichier |
secure_filename | “nettoyage” du nom du fichier |
Vérifier qu'il y a bien eu un fichier sélectionné :
fichier = request.files["fichier"] if fichier.filename: ... else: flash(u"Veuillez sélectionner un fichier !", "danger") return redirect(request.url)
Vérifier que le type fichier est autorisé :
ext = filename.rsplit(".", 1)[1] if ext.upper() in ["JPEG", "JPG", "PNG", "GIF"]: ... else: flash(u"Ce type de fichier n'est pas autorisé !", "danger") return redirect(request.url)
let frmUpload = document.getElementById('frmUpload'); let btnUpload = document.getElementById('btnUpload'); btnUpload.addEventListener('click', event => { btnUploadClick(event) }); function btnUploadClick(event) { event.preventDefault(); fetch('/upload', { method: 'POST', body : new FormData(frmUpload) }).then( //... ) }
@app.route("/upload", methods=["POST"]) def upload(): result = {} if 'edtFile' in request.files: if request.files['edtFile'].filename: fichier = request.files['edtFile'] fichier.save('/home/marc/...') # ... else: result['error'] = "Erreur, il n'y a pas de fichier." return jsonify(result)