{"title":"Gestion des fichiers","version":"6.0","locale":"fr","docname":"topics/files","url":"/fr/6.0/topics/files/","canonical":"https://djangodocs.dev/fr/6.0/topics/files/","summary":"Ce document décrit l’API Django d’accès aux fichiers adaptée par exemple aux fichiers envoyés par les utilisateurs. Les API de plus bas niveau sont assez générales…","html":"<h1>Gestion des fichiers<a class=\"heading-anchor\" href=\"#managing-files\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Ce document décrit l’API Django d’accès aux fichiers adaptée par exemple aux fichiers envoyés par les utilisateurs. Les API de plus bas niveau sont assez générales pour pouvoir être utilisées dans d’autres buts. Si vous souhaitez gérer les « fichiers statiques » (JS, CSS, etc.), consultez <a class=\"reference internal\" href=\"/fr/6.0/howto/static-files/\"><span class=\"doc\">Gestion des fichiers statiques (par ex. images, JavaScript, CSS)</span></a>.</p>\n<p>Par défaut, Django stocke les fichiers localement, en fonction des réglages <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a> et <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-MEDIA_URL\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_URL</span></code></a>. Les exemples ci-dessous partent du principe que vous utilisez ces valeurs par défaut.</p>\n<p>Cependant, Django permet d’écrire des <a class=\"reference internal\" href=\"#file-storage\">systèmes de stockage de fichiers</a> spécialisés permettant de personnaliser complètement l’endroit et la façon dont Django stocke les fichiers. La deuxième partie de ce document décrit le fonctionnement des ces systèmes de stockage.</p>\n<section id=\"using-files-in-models\">\n<h2>Utilisation des fichiers dans les modèles<a class=\"heading-anchor\" href=\"#using-files-in-models\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Quand vous utilisez un <a class=\"reference internal\" href=\"/fr/6.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> ou un <a class=\"reference internal\" href=\"/fr/6.0/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a>, Django fournit un ensemble d’API pour pouvoir manipuler le fichier correspondant.</p>\n<p>Considérez le modèle suivant qui utilise un <a class=\"reference internal\" href=\"/fr/6.0/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a> pour stocker une photo :</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.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Car</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"n\">models</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\">255</span><span class=\"p\">)</span>\n    <span class=\"n\">price</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">DecimalField</span><span class=\"p\">(</span><span class=\"n\">max_digits</span><span class=\"o\">=</span><span class=\"mi\">5</span><span class=\"p\">,</span> <span class=\"n\">decimal_places</span><span class=\"o\">=</span><span class=\"mi\">2</span><span class=\"p\">)</span>\n    <span class=\"n\">photo</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ImageField</span><span class=\"p\">(</span><span class=\"n\">upload_to</span><span class=\"o\">=</span><span class=\"s2\">&quot;cars&quot;</span><span class=\"p\">)</span>\n    <span class=\"n\">specs</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">upload_to</span><span class=\"o\">=</span><span class=\"s2\">&quot;specs&quot;</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Toute instance de <code class=\"docutils literal notranslate\"><span class=\"pre\">Car</span></code> possède un attribut <code class=\"docutils literal notranslate\"><span class=\"pre\">photo</span></code> qu’il est possible d’utiliser pour obtenir les détails de la photo jointe :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span> <span class=\"o\">=</span> <span class=\"n\">Car</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;57 Chevy&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span>\n<span class=\"go\">&lt;ImageFieldFile: cars/chevy.jpg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">name</span>\n<span class=\"go\">&#39;cars/chevy.jpg&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">path</span>\n<span class=\"go\">&#39;/media/cars/chevy.jpg&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">url</span>\n<span class=\"go\">&#39;https://media.example.com/cars/chevy.jpg&#39;</span>\n</code></pre></div>\n<p>Cet objet (<code class=\"docutils literal notranslate\"><span class=\"pre\">car.photo</span></code> dans l’exemple) est un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>, ce qui signifie qu’il possède toutes les méthodes et les attributs documentés ci-dessous.</p>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Le fichier est enregistré durant la phase d’enregistrement du modèle dans la base de données, il n’est donc pas possible de se baser sur le nom de fichier réel sur le disque tant que le modèle lui-même n’a pas été enregistré.</p>\n</aside>\n<p>Par exemple, vous pouvez modifier le nom de fichier en définissant l’attribut <a class=\"reference internal\" href=\"/fr/6.0/ref/files/file/#django.core.files.File.name\" title=\"django.core.files.File.name\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">name</span></code></a> du fichier à un chemin relatif à l’emplacement de stockage des fichiers (<a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a> si vous utilisez le <a class=\"reference internal\" href=\"/fr/6.0/ref/files/storage/#django.core.files.storage.FileSystemStorage\" title=\"django.core.files.storage.FileSystemStorage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">FileSystemStorage</span></code></a> par défaut) :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">import</span><span class=\"w\"> </span><span class=\"nn\">os</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">initial_path</span> <span class=\"o\">=</span> <span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">path</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">name</span> <span class=\"o\">=</span> <span class=\"s2\">&quot;cars/chevy_ii.jpg&quot;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">new_path</span> <span class=\"o\">=</span> <span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">join</span><span class=\"p\">(</span><span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">MEDIA_ROOT</span><span class=\"p\">,</span> <span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"c1\"># Move the file on the filesystem</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">os</span><span class=\"o\">.</span><span class=\"n\">rename</span><span class=\"p\">(</span><span class=\"n\">initial_path</span><span class=\"p\">,</span> <span class=\"n\">new_path</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">path</span>\n<span class=\"go\">&#39;/media/cars/chevy_ii.jpg&#39;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">path</span> <span class=\"o\">==</span> <span class=\"n\">new_path</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>Pour enregistrer un fichier existant sur le disque dans un champ <a class=\"reference internal\" href=\"/fr/6.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>:</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">pathlib</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Path</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.files</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">File</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">path</span> <span class=\"o\">=</span> <span class=\"n\">Path</span><span class=\"p\">(</span><span class=\"s2\">&quot;/some/external/specs.pdf&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span> <span class=\"o\">=</span> <span class=\"n\">Car</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;57 Chevy&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">with</span> <span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"n\">mode</span><span class=\"o\">=</span><span class=\"s2\">&quot;rb&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">f</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">specs</span> <span class=\"o\">=</span> <span class=\"n\">File</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">,</span> <span class=\"n\">name</span><span class=\"o\">=</span><span class=\"n\">path</span><span class=\"o\">.</span><span class=\"n\">name</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">()</span>\n<span class=\"gp\">...</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Note</p>\n<p>Bien que les attributs de données « non image » du champ <a class=\"reference internal\" href=\"/fr/6.0/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a>, tels que <code class=\"docutils literal notranslate\"><span class=\"pre\">height</span></code>, <code class=\"docutils literal notranslate\"><span class=\"pre\">width</span></code> et <code class=\"docutils literal notranslate\"><span class=\"pre\">size</span></code> (hauteur, largeur et taille), sont disponibles sur l’instance, les données d’image sous-jacente ne peuvent pas être utilisées sans réouvrir l’image. Par exemple :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">PIL</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">Image</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span> <span class=\"o\">=</span> <span class=\"n\">Car</span><span class=\"o\">.</span><span class=\"n\">objects</span><span class=\"o\">.</span><span class=\"n\">get</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"o\">=</span><span class=\"s2\">&quot;57 Chevy&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">width</span>\n<span class=\"go\">191</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">height</span>\n<span class=\"go\">287</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">image</span> <span class=\"o\">=</span> <span class=\"n\">Image</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"p\">)</span>\n<span class=\"go\"># Raises ValueError: seek of closed file.</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">()</span>\n<span class=\"go\">&lt;ImageFieldFile: cars/chevy.jpg&gt;</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">image</span> <span class=\"o\">=</span> <span class=\"n\">Image</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"n\">car</span><span class=\"o\">.</span><span class=\"n\">photo</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">image</span>\n<span class=\"go\">&lt;PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=191x287 at 0x7F99A94E9048&gt;</span>\n</code></pre></div>\n</aside>\n</section>\n<section id=\"the-file-object\">\n<h2>L’objet<a class=\"heading-anchor\" href=\"#the-file-object\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En interne, Django utilise une instance de <a class=\"reference internal\" href=\"/fr/6.0/ref/files/file/#django.core.files.File\" title=\"django.core.files.File\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.core.files.File</span></code></a> chaque fois qu’il a besoin de représenter un fichier.</p>\n<p>La plupart du temps, vous utiliserez l’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> que Django vous transmet (par exemple un fichier joint à un modèle comme ci-dessus ou peut-être un fichier téléversé).</p>\n<p>Si vous avez besoin de construire vous-même un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code>, la façon la plus simple est de le créer en utilisant un objet <code class=\"docutils literal notranslate\"><span class=\"pre\">file</span></code> de Python :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.files</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">File</span>\n\n<span class=\"go\"># Create a Python file object using open()</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span> <span class=\"o\">=</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;/path/to/hello.world&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">myfile</span> <span class=\"o\">=</span> <span class=\"n\">File</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Il est maintenant possible d’utiliser les attributs et les méthodes documentés de la classe <a class=\"reference internal\" href=\"/fr/6.0/ref/files/file/#django.core.files.File\" title=\"django.core.files.File\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">File</span></code></a>.</p>\n<p>Il faut savoir que les fichiers créés de cette façon ne sont pas fermés automatiquement. L’approche suivante peut être employée pour fermer automatiquement les fichiers :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.files</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">File</span>\n\n<span class=\"go\"># Create a Python file object using open() and the with statement</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"k\">with</span> <span class=\"nb\">open</span><span class=\"p\">(</span><span class=\"s2\">&quot;/path/to/hello.world&quot;</span><span class=\"p\">,</span> <span class=\"s2\">&quot;w&quot;</span><span class=\"p\">)</span> <span class=\"k\">as</span> <span class=\"n\">f</span><span class=\"p\">:</span>\n<span class=\"gp\">... </span>    <span class=\"n\">myfile</span> <span class=\"o\">=</span> <span class=\"n\">File</span><span class=\"p\">(</span><span class=\"n\">f</span><span class=\"p\">)</span>\n<span class=\"gp\">... </span>    <span class=\"n\">myfile</span><span class=\"o\">.</span><span class=\"n\">write</span><span class=\"p\">(</span><span class=\"s2\">&quot;Hello World&quot;</span><span class=\"p\">)</span>\n<span class=\"gp\">...</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">myfile</span><span class=\"o\">.</span><span class=\"n\">closed</span>\n<span class=\"go\">True</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">f</span><span class=\"o\">.</span><span class=\"n\">closed</span>\n<span class=\"go\">True</span>\n</code></pre></div>\n<p>La fermeture des fichiers est particulièrement importante lors de l’accès en boucle à des champs fichier pour un grand nombre d’objets. Si les fichiers ne sont pas fermés manuellement après les avoir lus, il y a un risque d’épuisement des descripteurs de fichiers. Cela peut amener à l’erreur suivante :</p>\n<div class=\"code-block\" data-language=\"pytb\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Pytb</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=\"Pytb code\"><code><span class=\"x\">OSError: [Errno 24] Too many open files</span>\n</code></pre></div>\n</section>\n<section id=\"file-storage\">\n<h2>Stockage des fichiers<a class=\"heading-anchor\" href=\"#file-storage\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>En arrière-plan, Django délègue les décisions au sujet des emplacements des fichiers et de la manière de les stocker à un système de stockage de fichiers. C’est cet objet qui s’occupe réellement des systèmes de fichiers, de l’ouverture et de la lecture des fichiers, etc.</p>\n<p>Le stockage de fichiers par défaut de Django est <code class=\"docutils literal notranslate\"><span class=\"pre\">'</span></code><a class=\"reference internal\" href=\"/fr/6.0/ref/files/storage/#django.core.files.storage.FileSystemStorage\" title=\"django.core.files.storage.FileSystemStorage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.core.files.storage.FileSystemStorage</span></code></a><code class=\"docutils literal notranslate\"><span class=\"pre\">'</span></code>. Si vous n’indiquez pas explicitement un système de stockage dans la clé <code class=\"docutils literal notranslate\"><span class=\"pre\">default</span></code> du réglage <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-STORAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STORAGES</span></code></a>, c’est celui qui sera utilisé.</p>\n<p>Lisez ci-dessous pour obtenir des détails sur le système de stockage de fichiers intégré par défaut et lisez <a class=\"reference internal\" href=\"/fr/6.0/howto/custom-file-storage/\"><span class=\"doc\">Écriture d’une classe de stockage personnalisée</span></a> pour plus d’informations sur l’écriture de son propre système de stockage de fichiers.</p>\n<section id=\"storage-objects\">\n<h3>Objets de stockage<a class=\"heading-anchor\" href=\"#storage-objects\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Bien que la plupart du temps il soit plus opportun de manipuler un objet  <code class=\"docutils literal notranslate\"><span class=\"pre\">File</span></code> (qui délègue au stockage adapté pour ce fichier), il est possible d’utiliser directement un stockage de fichiers. Vous pouvez créer une instance d’une classe de stockage de fichiers personnalisé ou, plus souvent utile, vous pouvez utiliser le système de stockage global par défaut :</p>\n<div class=\"code-block\" data-language=\"pycon\"><div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python console</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=\"Python console code\"><code><span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.files.base</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">ContentFile</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.core.files.storage</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">default_storage</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">path</span> <span class=\"o\">=</span> <span class=\"n\">default_storage</span><span class=\"o\">.</span><span class=\"n\">save</span><span class=\"p\">(</span><span class=\"s2\">&quot;path/to/file&quot;</span><span class=\"p\">,</span> <span class=\"n\">ContentFile</span><span class=\"p\">(</span><span class=\"sa\">b</span><span class=\"s2\">&quot;new content&quot;</span><span class=\"p\">))</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">path</span>\n<span class=\"go\">&#39;path/to/file&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">default_storage</span><span class=\"o\">.</span><span class=\"n\">size</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">)</span>\n<span class=\"go\">11</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">default_storage</span><span class=\"o\">.</span><span class=\"n\">open</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">)</span><span class=\"o\">.</span><span class=\"n\">read</span><span class=\"p\">()</span>\n<span class=\"go\">b&#39;new content&#39;</span>\n\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">default_storage</span><span class=\"o\">.</span><span class=\"n\">delete</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">)</span>\n<span class=\"gp\">&gt;&gt;&gt; </span><span class=\"n\">default_storage</span><span class=\"o\">.</span><span class=\"n\">exists</span><span class=\"p\">(</span><span class=\"n\">path</span><span class=\"p\">)</span>\n<span class=\"go\">False</span>\n</code></pre></div>\n<p>Voir <a class=\"reference internal\" href=\"/fr/6.0/ref/files/storage/\"><span class=\"doc\">API de stockage des fichiers</span></a> concernant l’API de stockage de fichiers.</p>\n</section>\n<section id=\"the-built-in-filesystem-storage-class\">\n<span id=\"builtin-fs-storage\"></span><h3>La classe de Django pour le stockage sur système de fichiers<a class=\"heading-anchor\" href=\"#the-built-in-filesystem-storage-class\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Django fournit une classe <a class=\"reference internal\" href=\"/fr/6.0/ref/files/storage/#django.core.files.storage.FileSystemStorage\" title=\"django.core.files.storage.FileSystemStorage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">django.core.files.storage.FileSystemStorage</span></code></a> qui implémente les éléments de base du stockage de fichiers sur un système de fichiers.</p>\n<p>Par exemple, le code suivant stocke les fichiers téléversés dans <code class=\"docutils literal notranslate\"><span class=\"pre\">/media/photos</span></code> quelle que soit la valeur du réglage <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-MEDIA_ROOT\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">MEDIA_ROOT</span></code></a>:</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.core.files.storage</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">FileSystemStorage</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n\n<span class=\"n\">fs</span> <span class=\"o\">=</span> <span class=\"n\">FileSystemStorage</span><span class=\"p\">(</span><span class=\"n\">location</span><span class=\"o\">=</span><span class=\"s2\">&quot;/media/photos&quot;</span><span class=\"p\">)</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">Car</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"o\">...</span>\n    <span class=\"n\">photo</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">ImageField</span><span class=\"p\">(</span><span class=\"n\">storage</span><span class=\"o\">=</span><span class=\"n\">fs</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Les <a class=\"reference internal\" href=\"/fr/6.0/howto/custom-file-storage/\"><span class=\"doc\">systèmes de stockage personnalisés</span></a> fonctionnent de la même manière : vous pouvez les transmettre comme paramètre <code class=\"docutils literal notranslate\"><span class=\"pre\">storage</span></code> d’un champ <a class=\"reference internal\" href=\"/fr/6.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>.</p>\n</section>\n<section id=\"using-a-callable\">\n<h3>Utilisation d’un exécutable<a class=\"heading-anchor\" href=\"#using-a-callable\"><span class=\"visually-hidden\">Lien vers cette rubrique</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Vous pouvez transmettre un objet exécutable comme paramètre <a class=\"reference internal\" href=\"/fr/6.0/ref/models/fields/#django.db.models.FileField.storage\" title=\"django.db.models.FileField.storage\"><code class=\"xref py py-attr docutils literal notranslate\"><span class=\"pre\">storage</span></code></a> de <a class=\"reference internal\" href=\"/fr/6.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> ou de <a class=\"reference internal\" href=\"/fr/6.0/ref/models/fields/#django.db.models.ImageField\" title=\"django.db.models.ImageField\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">ImageField</span></code></a>. Cela permet de modifier le stockage utilisé au moment de l’exécution, choisissant par exemple différents stockages en fonction de l’environnement.</p>\n<p>Your callable will be evaluated when your model classes are loaded, and must\nreturn an instance of <a class=\"reference internal\" href=\"/fr/6.0/ref/files/storage/#django.core.files.storage.Storage\" title=\"django.core.files.storage.Storage\"><code class=\"xref py py-class docutils literal notranslate\"><span class=\"pre\">Storage</span></code></a>.</p>\n<p>Par exemple :</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.conf</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">settings</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.db</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">models</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">.storages</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">MyLocalStorage</span><span class=\"p\">,</span> <span class=\"n\">MyRemoteStorage</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">select_storage</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"n\">MyLocalStorage</span><span class=\"p\">()</span> <span class=\"k\">if</span> <span class=\"n\">settings</span><span class=\"o\">.</span><span class=\"n\">DEBUG</span> <span class=\"k\">else</span> <span class=\"n\">MyRemoteStorage</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">my_file</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">storage</span><span class=\"o\">=</span><span class=\"n\">select_storage</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Afin de définir un stockage défini dans le réglage <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-STORAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STORAGES</span></code></a>, vous pouvez utiliser <a class=\"reference internal\" href=\"/fr/6.0/ref/files/storage/#django.core.files.storage.storages\" title=\"django.core.files.storage.storages\"><code class=\"xref py py-data docutils literal notranslate\"><span class=\"pre\">storages</span></code></a>:</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.core.files.storage</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">storages</span>\n\n\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">select_storage</span><span class=\"p\">():</span>\n    <span class=\"k\">return</span> <span class=\"n\">storages</span><span class=\"p\">[</span><span class=\"s2\">&quot;mystorage&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">upload</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">storage</span><span class=\"o\">=</span><span class=\"n\">select_storage</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>Because the callable is evaluated when your model classes are loaded, if you\nneed to override the <a class=\"reference internal\" href=\"/fr/6.0/ref/settings/#std-setting-STORAGES\"><code class=\"xref std std-setting docutils literal notranslate\"><span class=\"pre\">STORAGES</span></code></a> setting in tests, you should use a\n<code class=\"docutils literal notranslate\"><span class=\"pre\">LazyObject</span></code> subclass instead:</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.core.files.storage</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">storages</span>\n<span class=\"kn\">from</span><span class=\"w\"> </span><span class=\"nn\">django.utils.functional</span><span class=\"w\"> </span><span class=\"kn\">import</span> <span class=\"n\">LazyObject</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">OtherStorage</span><span class=\"p\">(</span><span class=\"n\">LazyObject</span><span class=\"p\">):</span>\n    <span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">_setup</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">):</span>\n        <span class=\"bp\">self</span><span class=\"o\">.</span><span class=\"n\">_wrapped</span> <span class=\"o\">=</span> <span class=\"n\">storages</span><span class=\"p\">[</span><span class=\"s2\">&quot;mystorage&quot;</span><span class=\"p\">]</span>\n\n\n<span class=\"n\">my_storage</span> <span class=\"o\">=</span> <span class=\"n\">OtherStorage</span><span class=\"p\">()</span>\n\n\n<span class=\"k\">class</span><span class=\"w\"> </span><span class=\"nc\">MyModel</span><span class=\"p\">(</span><span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">Model</span><span class=\"p\">):</span>\n    <span class=\"n\">upload</span> <span class=\"o\">=</span> <span class=\"n\">models</span><span class=\"o\">.</span><span class=\"n\">FileField</span><span class=\"p\">(</span><span class=\"n\">storage</span><span class=\"o\">=</span><span class=\"n\">my_storage</span><span class=\"p\">)</span>\n</code></pre></div>\n<p>L’objet <code class=\"docutils literal notranslate\"><span class=\"pre\">LazyObject</span></code> diffère l’évaluation du stockage jusqu’au moment où il est réellement employé, ce qui permet à <a class=\"reference internal\" href=\"/fr/6.0/topics/testing/tools/#django.test.override_settings\" title=\"django.test.override_settings\"><code class=\"xref py py-func docutils literal notranslate\"><span class=\"pre\">override_settings()</span></code></a> de faire effet :</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=\"nd\">@override_settings</span><span class=\"p\">(</span>\n    <span class=\"n\">STORAGES</span><span class=\"o\">=</span><span class=\"p\">{</span>\n        <span class=\"s2\">&quot;mystorage&quot;</span><span class=\"p\">:</span> <span class=\"p\">{</span>\n            <span class=\"s2\">&quot;BACKEND&quot;</span><span class=\"p\">:</span> <span class=\"s2\">&quot;django.core.files.storage.InMemoryStorage&quot;</span><span class=\"p\">,</span>\n        <span class=\"p\">}</span>\n    <span class=\"p\">}</span>\n<span class=\"p\">)</span>\n<span class=\"k\">def</span><span class=\"w\"> </span><span class=\"nf\">test_storage</span><span class=\"p\">():</span>\n    <span class=\"n\">model</span> <span class=\"o\">=</span> <span class=\"n\">MyModel</span><span class=\"p\">()</span>\n    <span class=\"k\">assert</span> <span class=\"nb\">isinstance</span><span class=\"p\">(</span><span class=\"n\">model</span><span class=\"o\">.</span><span class=\"n\">upload</span><span class=\"o\">.</span><span class=\"n\">storage</span><span class=\"p\">,</span> <span class=\"n\">InMemoryStorage</span><span class=\"p\">)</span>\n</code></pre></div>\n</section>\n</section>","rootId":"managing-files","toc":[{"title":"Utilisation des fichiers dans les modèles","anchor":"using-files-in-models","children":[]},{"title":"L’objet","anchor":"the-file-object","children":[]},{"title":"Stockage des fichiers","anchor":"file-storage","children":[{"title":"Objets de stockage","anchor":"storage-objects","children":[]},{"title":"La classe de Django pour le stockage sur système de fichiers","anchor":"the-built-in-filesystem-storage-class","children":[]},{"title":"Utilisation d’un exécutable","anchor":"using-a-callable","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Utilisation de Django","url":"/fr/6.0/topics/"}],"prev":{"docname":"topics/migrations","title":"Migrations","url":"/fr/6.0/topics/migrations/"},"next":{"docname":"topics/testing/index","title":"Les tests dans Django","url":"/fr/6.0/topics/testing/"},"formats":{"html":"/fr/6.0/topics/files/","markdown":"/fr/6.0/topics/files.md","json":"/fr/6.0/topics/files.json"},"source":"https://github.com/django/django/blob/stable/6.0.x/docs/topics/files.txt","official":"https://docs.djangoproject.com/fr/6.0/topics/files/","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","sv","zh-hans","ga","fr","ja","id","it","pt-br","ko","es","el","pl"]}