1. A propos de l'attribut enctype="multipart/form-data"
L'attribut enctype="multipart/form-data" est essentiel dans les formulaires Django (et HTML en général) lorsqu'on doit envoyer des fichiers depuis un client vers un serveur.
Fonctionnement
- Définition : enctype (Encoding Type) spécifie comment les données du formulaire doivent être encodées lors de leur envoi au serveur.
- Valeur par défaut : Sans cet attribut, la valeur par défaut est application/x-www-form-urlencoded, qui convient pour les données textuelles simples.
- Nécessité pour les fichiers : Pour envoyer des fichiers (images, documents, etc.), vous devez utiliser multipart/form-data car :
- Il permet d'envoyer des données binaires
- Il sépare les différents champs du formulaire en "parties" distinctes
2. Utilisation dans Django
Dans un template Django, vous l'utiliserez comme ceci :
1 2 3 4 5 |
<form method="post" enctype="multipart/form-data"> {% csrf_token %} {{ form.as_p }} <button type="submit">Envoyer</button> </form> |
3. Conséquences côté serveur
3.1 Dans une vue Django:
- Vérifier request.method == 'POST'
- Gérer à la fois request.POST pour les données normales
- Et request.FILES pour les fichiers uploadés
3.2 Exemple de vue en django
1 2 3 4 5 6 7 8 9 10 |
def upload_file(request): if request.method == 'POST': form = MyForm(request.POST, request.FILES) if form.is_valid(): # Traiter le fichier ici instance = form.save() return redirect('success') else: form = MyForm() return render(request, 'upload.html', {'form': form}) |
4. Nécessité de l'attribut attribut enctype="multipart/form-data"
- Envoie des fichiers : Sans multipart/form-data, les fichiers ne seraient pas correctement encodés et ne parviendraient pas au serveur
- Intégrité des données binaires : L'attribut enctype="multipart/form-data" permet de préserver l'intégrité des données binaires pendant le transfert
- Encodage standard : C'est le seul encodage standardisé pour l'envoi de fichiers via HTTP
5. Utilisation de l'attribut enctype="multipart/form-data" dans Flask
Dans Flask, comme dans Django, l'attribut enctype="multipart/form-data" est essentiel pour gérer l'upload de fichiers, mais son implémentation diffère légèrement.
5.1 Usage de base dans Flask
1 2 3 4 5 |
<!-- Dans votre template HTML --> <form method="POST" enctype="multipart/form-data"> <input type="file" name="file"> <input type="submit" value="Upload"> </form> |
5.2 Traitement côté serveur avec Flask
Accès aux fichiers :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
from flask import Flask, request app = Flask(__name__) @app.route('/upload', methods=['POST']) def upload_file(): if 'file' not in request.files: return 'Aucun fichier envoyé', 400 file = request.files['file'] if file.filename == '': return 'Aucun fichier sélectionné', 400 # Sauvegarder le fichier file.save(f"/chemin/vers/dossier/uploads/{file.filename}") return 'Fichier uploadé avec succès' |
Configuration nécessaire :
Flask utilise request.files pour accéder aux fichiers uploadés
Vous pouvez limiter la taille des fichiers avec :
1 |
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB max |
Younes Derfoufi
CRMEF OUJDA