{"title":"Envoi de fichiers","version":"2.0","locale":"fr","docname":"topics/http/file-uploads","url":"/fr/2.0/topics/http/file-uploads/","canonical":"https://djangodocs.dev/fr/2.0/topics/http/file-uploads/","summary":"Lorsque Django gère un téléversement de fichier, les données du fichier aboutissent dans request.FILES (plus de détails sur l’objet request se trouvent dans la…","html":"<h1>Envoi de fichiers<a class=\"heading-anchor\" href=\"#file-uploads\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Lorsque Django gère un téléversement de fichier, les données du fichier aboutissent dans <a class=\"reference internal\" href=\"/fr/2.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> (plus de détails sur l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> se trouvent dans la documentation des <a class=\"reference internal\" href=\"/fr/2.0/ref/request-response/\"><span class=\"doc\">objets request et response</span></a>). Ce document explique comment les fichiers sont stockés sur disque et en mémoire, et comment personnaliser le comportement par défaut.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Avertissement</p>\n<p>Il existe des risques de sécurité si vous acceptez du contenu téléversé de la part d’utilisateurs non fiables. Consultez le sujet <a class=\"reference internal\" href=\"/fr/2.0/topics/security/#user-uploaded-content-security\"><span class=\"std std-ref\">Contenu envoyé par les utilisateurs</span></a> du guide de sécurité pour des détails sur les mesures de réduction des risques.</p>\n</aside>\n<section id=\"basic-file-uploads\">\n<h2>Envoi simple de fichiers<a class=\"heading-anchor\" href=\"#basic-file-uploads\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Considérez ce simple formulaire contenant un champ <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>forms.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"forms.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">UploadFileForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">title</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">CharField</span><span class=\"p\">(</span><span class=\"n\">max_length</span><span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    <span class=\"n\">file</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">()</span>\n</code></pre></figure>\n<p>Une vue gérant ce formulaire recevra les données de fichier dans <a class=\"reference internal\" href=\"/fr/2.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> qui est un dictionnaire contenant une clé pour chaque <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> (ou <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a>, ou toute autre sous-classe de <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a>) du formulaire. Ainsi, les données du formulaire ci-dessus seraient accessibles dans <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES['file']</span></code>.</p>\n<p>Notez que <a class=\"reference internal\" href=\"/fr/2.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> ne contient les données que lorsque la méthode de requête est <code class=\"docutils literal notranslate\"><span class=\"pre\">POST</span></code> et que le formulaire``&lt;form&gt;`` à l’origine de la requête possède l’attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">enctype=&quot;multipart/form-data&quot;</span></code>. Sinon, <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code> est vide.</p>\n<p>La plupart du temps, les données de fichiers seront simplement transmises de <code class=\"docutils literal notranslate\"><span class=\"pre\">request</span></code> au formulaire comme expliqué dans <a class=\"reference internal\" href=\"/fr/2.0/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Liaison de fichiers téléversés avec un formulaire</span></a>. Voici ce que cela peut donner :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>views.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UploadFileForm</span>\n\n<span class=\"c1\"># Imaginary function to handle an uploaded file.</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">somewhere</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">handle_uploaded_file</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">handle_uploaded_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">])</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/url/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;upload.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></figure>\n<p>Remarquez que nous devons transmettre <a class=\"reference internal\" href=\"/fr/2.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> au constructeur du formulaire ; c’est comme cela que les données de fichiers sont liées à un formulaire.</p>\n<p>Voici une manière habituelle de gérer un fichier téléversé :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">handle_uploaded_file</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">):</span>\n    <span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s1\">&#39;some/file/name.txt&#39;</span><span class=\"p\">,</span> <span class=\"s1\">&#39;wb+&#39;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">destination</span><span class=\"p\">:</span>\n        <span class=\"k\">for</span> <span class=\"n\">chunk</span> <span class=\"ow\">in</span> <span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">chunks</span><span class=\"p\">():</span>\n            <span class=\"n\">destination</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"n\">chunk</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>En bouclant sur <code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile.chunks()</span></code> au lieu d’appeler <code class=\"docutils literal notranslate\"><span class=\"pre\">read()</span></code>, on peut s’assurer que les gros fichiers ne saturent pas la mémoire du système.</p>\n<p>Il existe quelques autres méthodes et attributs accessibles pour les objets <code class=\"docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code>. Voir <a class=\"reference internal\" href=\"/fr/2.0/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile\" title=\"django.core.files.uploadedfile.UploadedFile\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">UploadedFile</span></code></a> pour une référence complète.</p>\n<section id=\"handling-uploaded-files-with-a-model\">\n<h3>Téléversement de fichiers liés à un modèle<a class=\"heading-anchor\" href=\"#handling-uploaded-files-with-a-model\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous enregistrez un fichier dans un <a class=\"reference internal\" href=\"/fr/2.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Model</span></code></a> contenant un champ <a class=\"reference internal\" href=\"/fr/2.0/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a>, l’emploi d’un formulaire <a class=\"reference internal\" href=\"/fr/2.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ModelForm</span></code></a> simplifie le processus. L’objet fichier sera enregistré à l’emplacement indiqué par le paramètre <a class=\"reference internal\" href=\"/fr/2.0/ref/models/fields/#django.db.models.FileField.upload_to\" title=\"django.db.models.FileField.upload_to\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">upload_to</span></code></a> du champ <a class=\"reference internal\" href=\"/fr/2.0/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileField</span></code></a> correspondant lors de l’appel à <code class=\"docutils literal notranslate\"><span class=\"pre\">form.save()</span></code>:</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelFormWithFileField</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ModelFormWithFileField</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"c1\"># file is saved</span>\n            <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/url/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">ModelFormWithFileField</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;upload.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></div>\n<p>Si vous construisez manuellement un objet, vous pouvez simplement attribuer l’objet fichier provenant de <a class=\"reference internal\" href=\"/fr/2.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code></a> au champ de fichier du modèle :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.http</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">HttpResponseRedirect</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.shortcuts</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">render</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">UploadFileForm</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.models</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ModelWithFileField</span>\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"k\">if</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">method</span> <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">POST</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"n\">instance</span> <span class=\"o\">=</span> <span class=\"n\">ModelWithFileField</span><span class=\"p\">(</span><span class=\"n\">file_field</span><span class=\"o\">=</span><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">])</span>\n            <span class=\"n\">instance</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n            <span class=\"k\">return</span> <span class=\"n\">HttpResponseRedirect</span><span class=\"p\">(</span><span class=\"s1\">&#39;/success/url/&#39;</span><span class=\"p\">)</span>\n    <span class=\"k\">else</span><span class=\"p\">:</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"n\">UploadFileForm</span><span class=\"p\">()</span>\n    <span class=\"k\">return</span> <span class=\"n\">render</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"s1\">&#39;upload.html&#39;</span><span class=\"p\">,</span> <span class=\"p\">{</span><span class=\"s1\">&#39;form&#39;</span><span class=\"p\">:</span> <span class=\"n\">form</span><span class=\"p\">})</span>\n</code></pre></div>\n</section>\n<section id=\"uploading-multiple-files\">\n<h3>Téléversement de fichiers multiples<a class=\"heading-anchor\" href=\"#uploading-multiple-files\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Si vous souhaitez permettre le téléversement de plusieurs fichiers à l’aide d’un seul champ de formulaire, définissez l’attribut HTML <code class=\"docutils literal notranslate\"><span class=\"pre\">multiple</span></code> du composant de champ :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>forms.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"forms.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">forms</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FileFieldForm</span><span class=\"p\">(</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">Form</span><span class=\"p\">):</span>\n    <span class=\"n\">file_field</span> <span class=\"o\">=</span> <span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">widget</span><span class=\"o\">=</span><span class=\"n\">forms</span><span class=\"o\">.</span><span class=\"n\">ClearableFileInput</span><span class=\"p\">(</span><span class=\"n\">attrs</span><span class=\"o\">=</span><span class=\"p\">{</span><span class=\"s1\">&#39;multiple&#39;</span><span class=\"p\">:</span> <span class=\"kc\">True</span><span class=\"p\">}))</span>\n</code></pre></figure>\n<p>Puis surchargez la méthode <code class=\"docutils literal notranslate\"><span class=\"pre\">post</span></code> de votre sous-classe de <a class=\"reference internal\" href=\"/fr/2.0/ref/class-based-views/generic-editing/#django.views.generic.edit.FormView\" title=\"django.views.generic.edit.FormView\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FormView</span></code></a> pour pouvoir gérer plusieurs fichiers reçus :</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"default\"><figcaption class=\"code-block-caption\"><code>views.py</code></figcaption><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"views.py\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.generic.edit</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FormView</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.forms</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FileFieldForm</span>\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">FileFieldView</span><span class=\"p\">(</span><span class=\"n\">FormView</span><span class=\"p\">):</span>\n    <span class=\"n\">form_class</span> <span class=\"o\">=</span> <span class=\"n\">FileFieldForm</span>\n    <span class=\"n\">template_name</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;upload.html&#39;</span>  <span class=\"c1\"># Replace with your template.</span>\n    <span class=\"n\">success_url</span> <span class=\"o\">=</span> <span class=\"s1\">&#39;...&#39;</span>  <span class=\"c1\"># Replace with your URL or reverse().</span>\n\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">post</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> <span class=\"n\">request</span><span class=\"p\">,</span> <span class=\"o\">*</span><span class=\"n\">args</span><span class=\"p\">,</span> <span class=\"o\">**</span><span class=\"n\">kwargs</span><span class=\"p\">):</span>\n        <span class=\"n\">form_class</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_form_class</span><span class=\"p\">()</span>\n        <span class=\"n\">form</span> <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">get_form</span><span class=\"p\">(</span><span class=\"n\">form_class</span><span class=\"p\">)</span>\n        <span class=\"n\">files</span> <span class=\"o\">=</span> <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">FILES</span><span class=\"o\">.</span><span class=\"n\">getlist</span><span class=\"p\">(</span><span class=\"s1\">&#39;file_field&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> <span class=\"n\">form</span><span class=\"o\">.</span><span class=\"n\">is_valid</span><span class=\"p\">():</span>\n            <span class=\"k\">for</span> <span class=\"n\">f</span> <span class=\"ow\">in</span> <span class=\"n\">files</span><span class=\"p\">:</span>\n                <span class=\"o\">...</span>  <span class=\"c1\"># Do something with each file.</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">form_valid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n        <span class=\"k\">else</span><span class=\"p\">:</span>\n            <span class=\"k\">return</span> <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">form_invalid</span><span class=\"p\">(</span><span class=\"n\">form</span><span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n</section>\n<section id=\"upload-handlers\">\n<h2>Gestionnaires de téléversement<a class=\"heading-anchor\" href=\"#upload-handlers\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Lorsqu’un utilisateur envoie un fichier, Django transmet les données du fichier à un <em>gestionnaire de téléversement</em>, une petite classe qui gère les données du fichier reçu. Les gestionnaires de téléversement sont définis initialement dans le réglage <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_HANDLERS</span></code></a> dont le contenu par défaut est :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"p\">[</span><span class=\"s2\">&quot;django.core.files.uploadhandler.MemoryFileUploadHandler&quot;</span><span class=\"p\">,</span>\n <span class=\"s2\">&quot;django.core.files.uploadhandler.TemporaryFileUploadHandler&quot;</span><span class=\"p\">]</span>\n</code></pre></div>\n<p>Conjointement, <a class=\"reference internal\" href=\"/fr/2.0/ref/files/uploads/#django.core.files.uploadhandler.MemoryFileUploadHandler\" title=\"django.core.files.uploadhandler.MemoryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">MemoryFileUploadHandler</span></code></a> et <a class=\"reference internal\" href=\"/fr/2.0/ref/files/uploads/#django.core.files.uploadhandler.TemporaryFileUploadHandler\" title=\"django.core.files.uploadhandler.TemporaryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">TemporaryFileUploadHandler</span></code></a> définissent le comportement Django par défaut de téléversement de fichier en plaçant les petits fichiers en mémoire et les plus gros sur le disque.</p>\n<p>Vous pouvez écrire des gestionnaires personnalisée qui modifient la façon de gérer les fichiers. Vous pourriez par exemple utiliser des gestionnaires personnalisés pour limiter la quantité de données par utilisateur, compresser les données à la volée, afficher des barres de progression ou même envoyer directement des données vers un autre emplacement de stockage sans les stocker localement. Voir <a class=\"reference internal\" href=\"/fr/2.0/ref/files/uploads/#custom-upload-handlers\"><span class=\"std std-ref\">Écriture de gestionnaires de téléversement personnalisés</span></a> pour plus de détails sur la manière de personnaliser ou de remplacer complètement le comportement de téléversement.</p>\n<section id=\"where-uploaded-data-is-stored\">\n<h3>Emplacement de stockage des données<a class=\"heading-anchor\" href=\"#where-uploaded-data-is-stored\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Avant d’enregistrer des fichiers téléversés, les données doivent bien être stockées quelque part.</p>\n<p>Par défaut, si un fichier téléversé est plus petit que 2,5 Mio, Django place la totalité du fichier en mémoire. Cela signifie que l’enregistrement du fichier correspond à une simple lecture en mémoire et à une écriture sur le disque, ce qui est très rapide.</p>\n<p>Cependant, si un fichier téléversé est trop gros, Django écrit le fichier dans un fichier temporaire stocké dans le répertoire des fichiers temporaires du système. Sur une plate-forme de type Unix, Django va en principe générer un fichier dont le chemin correspond à quelque chose comme <code class=\"docutils literal notranslate\"><span class=\"pre\">/tmp/tmpzfp6I6.upload</span></code>. Si le fichier est suffisamment gros, vous pouvez même voir la taille du fichier augmenter au fur et à mesure de son flux d’enregistrement vers le disque.</p>\n<p>Ces paramètres spécifiques, 2,5 Mio, <code class=\"docutils literal notranslate\"><span class=\"pre\">/tmp</span></code>, etc. ne sont que des valeurs par défaut « raisonnables » qui peuvent être personnalisés comme expliqué dans la section suivante.</p>\n</section>\n<section id=\"changing-upload-handler-behavior\">\n<h3>Modification de la gestion des téléversements<a class=\"heading-anchor\" href=\"#changing-upload-handler-behavior\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Certains réglages permettent de contrôler le comportement de téléversement de fichiers de Django. Voir <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#file-upload-settings\"><span class=\"std std-ref\">Réglages de téléversement de fichiers</span></a> pour plus de détails.</p>\n</section>\n<section id=\"modifying-upload-handlers-on-the-fly\">\n<span id=\"id1\"></span><h3>Modification des gestionnaires de téléversement à la volée<a class=\"heading-anchor\" href=\"#modifying-upload-handlers-on-the-fly\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Parfois, certaines vues ont besoin d’un comportement de téléversement différent. Dans ces situations, il est possible de surcharger les gestionnaires de téléversement par requête en modifiant <code class=\"docutils literal notranslate\"><span class=\"pre\">request.upload_handlers</span></code>. Par défaut, celle liste contient les gestionnaires de téléversement énumérés dans <a class=\"reference internal\" href=\"/fr/2.0/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">FILE_UPLOAD_HANDLERS</span></code></a>, mais cette liste est modifiable comme n’importe quelle autre liste.</p>\n<p>Par exemple, supposons que vous ayez écrit un gestionnaire <code class=\"docutils literal notranslate\"><span class=\"pre\">ProgressBarUploadHandler</span></code> qui renvoie des informations de progression de téléversement d’un composant AJAX quelconque. Voici comment ajouter ce gestionnaire à la liste des gestionnaires de téléversement :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">upload_handlers</span><span class=\"o\">.</span><span class=\"n\">insert</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">ProgressBarUploadHandler</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">))</span>\n</code></pre></div>\n<p>Dans ce cas, <code class=\"docutils literal notranslate\"><span class=\"pre\">list.insert()</span></code> peut être plus approprié que <code class=\"docutils literal notranslate\"><span class=\"pre\">append()</span></code> parce qu’un gestionnaire de barre de progression devrait être exécuté <em>avant</em> tout autre gestionnaire. Souvenez-vous que les gestionnaires de téléversement sont appelés dans l’ordre.</p>\n<p>Si vous vouliez totalement remplacer les gestionnaires de téléversement, il suffirait d’attribuer une nouvelle liste :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">upload_handlers</span> <span class=\"o\">=</span> <span class=\"p\">[</span><span class=\"n\">ProgressBarUploadHandler</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Il n’est possible de modifier les gestionnaires de téléversement qu”<em>avant</em> d’accéder à <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code> ou <code class=\"docutils literal notranslate\"><span class=\"pre\">request.FILES</span></code>, car ça n’aurait pas de sens de modifier les gestionnaires de téléversement après que la gestion des téléversements a déjà démarré. Si vous le faites tout de même, Django générera une erreur.</p>\n<p>Ceci dit, la modification des gestionnaires de téléversement devrait toujours intervenir aussi tôt que possible dans les vues.</p>\n<p>De plus, <a class=\"reference internal\" href=\"/fr/2.0/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">CsrfViewMiddleware</span></code></a> qui est un intergiciel activé par défaut accède à <code class=\"docutils literal notranslate\"><span class=\"pre\">request.POST</span></code>. Cela signifie qu’il est nécessaire de décorer avec <a class=\"reference internal\" href=\"/fr/2.0/ref/csrf/#django.views.decorators.csrf.csrf_exempt\" title=\"django.views.decorators.csrf.csrf_exempt\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_exempt()</span></code></a> les vues dans lesquelles vous souhaitez changer les gestionnaires de téléversement. Il faut ensuite utiliser <a class=\"reference internal\" href=\"/fr/2.0/ref/csrf/#django.views.decorators.csrf.csrf_protect\" title=\"django.views.decorators.csrf.csrf_protect\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">csrf_protect()</span></code></a> sur la fonction qui traite effectivement la requête. Remarquez qu’il se pourrait que les gestionnaires commencent à recevoir un fichier envoyé avant que les contrôles CSRF aient été effectués. Exemple de code :</p>\n<div class=\"code-block\" data-language=\"default\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Code</span><button type=\"button\" class=\"copy-button\" data-copy hidden><span class=\"copy-button-label\">Copy</span></button></div><pre role=\"group\" tabindex=\"0\" aria-label=\"Code code\"><code><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.views.decorators.csrf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">csrf_exempt</span><span class=\"p\">,</span> <span class=\"n\">csrf_protect</span>\n\n<span class=\"nd\">@csrf_exempt</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">upload_file_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"n\">request</span><span class=\"o\">.</span><span class=\"n\">upload_handlers</span><span class=\"o\">.</span><span class=\"n\">insert</span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> <span class=\"n\">ProgressBarUploadHandler</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">))</span>\n    <span class=\"k\">return</span> <span class=\"n\">_upload_file_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">)</span>\n\n<span class=\"nd\">@csrf_protect</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_upload_file_view</span><span class=\"p\">(</span><span class=\"n\">request</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span> <span class=\"c1\"># Process request</span>\n</code></pre></div>\n</aside>\n</section>\n</section>","rootId":"file-uploads","toc":[{"title":"Envoi simple de fichiers","anchor":"basic-file-uploads","children":[{"title":"Téléversement de fichiers liés à un modèle","anchor":"handling-uploaded-files-with-a-model","children":[]},{"title":"Téléversement de fichiers multiples","anchor":"uploading-multiple-files","children":[]}]},{"title":"Gestionnaires de téléversement","anchor":"upload-handlers","children":[{"title":"Emplacement de stockage des données","anchor":"where-uploaded-data-is-stored","children":[]},{"title":"Modification de la gestion des téléversements","anchor":"changing-upload-handler-behavior","children":[]},{"title":"Modification des gestionnaires de téléversement à la volée","anchor":"modifying-upload-handlers-on-the-fly","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/2.0/topics/"},{"docname":"topics/http/index","title":"Gestion des requêtes HTTP","url":"/fr/2.0/topics/http/"}],"prev":{"docname":"topics/http/decorators","title":"Décorateurs de vue","url":"/fr/2.0/topics/http/decorators/"},"next":{"docname":"topics/http/shortcuts","title":"Les fonctions raccourcis de Django","url":"/fr/2.0/topics/http/shortcuts/"},"formats":{"html":"/fr/2.0/topics/http/file-uploads/","markdown":"/fr/2.0/topics/http/file-uploads.md","json":"/fr/2.0/topics/http/file-uploads.json"},"source":"https://github.com/django/django/blob/stable/2.0.x/docs/topics/http/file-uploads.txt","official":"https://docs.djangoproject.com/fr/2.0/topics/http/file-uploads/","inVersions":["6.1","6.0","5.2","5.1","5.0","4.2","4.1","4.0","3.2","3.1","3.0","2.2","2.1","2.0","1.11","1.10","1.9"],"inLocales":["en","zh-hans","fr","ja","id","pt-br","ko","es","el","pl"]}