{"title":"“Upload” de arquivos","version":"3.0","locale":"pt-br","docname":"topics/http/file-uploads","url":"/pt-br/3.0/topics/http/file-uploads/","canonical":"https://djangodocs.dev/pt-br/3.0/topics/http/file-uploads/","summary":"Quando o Django lida com o upload de arquivos, o arquivo de dados termina sendo colocado em request.FILES (para mais sobre o objeto request veja a…","html":"<h1>“Upload” de arquivos<a class=\"heading-anchor\" href=\"#file-uploads\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h1>\n<p>Quando o Django lida com o upload de arquivos, o arquivo de dados termina sendo colocado em <a class=\"reference internal\" href=\"/pt-br/3.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> (para mais sobre o objeto <code class=\"docutils literal notranslate\">request</code> veja a documentação sobre <a class=\"reference internal\" href=\"/pt-br/3.0/ref/request-response/\"><span class=\"doc\">objetos de requisição e resposta</span></a>). Este documento explica como arquivos são armazenados no disco ou na memória, e como personalizar o comportamento padrão.</p>\n<aside class=\"admonition admonition-warning\" role=\"note\">\n<p class=\"admonition-title\">Aviso</p>\n<p>Existem riscos de segurança se você estiver aceitando o upload de conteúdo de usuários não confiáveis! Veja o tópico do guia de segurança em <a class=\"reference internal\" href=\"/pt-br/3.0/topics/security/#user-uploaded-content-security\"><span class=\"std std-ref\">Conteúdo carregado por upload de usuários</span></a> para detalhes.</p>\n</aside>\n<section id=\"basic-file-uploads\">\n<h2>Básico sobre upload de arquivos<a class=\"heading-anchor\" href=\"#basic-file-uploads\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Consider a form containing a <a class=\"reference internal\" href=\"/pt-br/3.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a>:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">forms.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">UploadFileForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    title <span class=\"o\">=</span> forms<span class=\"o\">.</span>CharField<span class=\"p\">(</span>max_length<span class=\"o\">=</span><span class=\"mi\">50</span><span class=\"p\">)</span>\n    file <span class=\"o\">=</span> forms<span class=\"o\">.</span>FileField<span class=\"p\">()</span>\n</code></pre></figure>\n<p>Uma “view” que lida com este formulário irá receber o arquivo em <a class=\"reference internal\" href=\"/pt-br/3.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a>, o qual é um dicionário contendo uma chave para cada <a class=\"reference internal\" href=\"/pt-br/3.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> (ou <a class=\"reference internal\" href=\"/pt-br/3.0/ref/forms/fields/#django.forms.ImageField\" title=\"django.forms.ImageField\"><code class=\"xref py py-class docutils literal notranslate\">ImageField</code></a>, ou outra subclasse de <a class=\"reference internal\" href=\"/pt-br/3.0/ref/forms/fields/#django.forms.FileField\" title=\"django.forms.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a>) no formulário. Tal que os dados vindos do formulário acima devem estar acessíveis como <code class=\"docutils literal notranslate\">request.FILES['file']</code>.</p>\n<p>Note que <a class=\"reference internal\" href=\"/pt-br/3.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> somente terá dados se o métodos de requisição for <code class=\"docutils literal notranslate\">POST</code> e o <code class=\"docutils literal notranslate\">&lt;form&gt;</code> que postou a requisição tem o atributo <code class=\"docutils literal notranslate\">enctype=&quot;multipart/form-data&quot;</code>. Do contrário, o <code class=\"docutils literal notranslate\">request.FILES</code> estará vazio.</p>\n<p>Most of the time, you’ll pass the file data from <code class=\"docutils literal notranslate\">request</code> into the form as\ndescribed in <a class=\"reference internal\" href=\"/pt-br/3.0/ref/forms/api/#binding-uploaded-files\"><span class=\"std std-ref\">Binding uploaded files to a form</span></a>. This would look something like:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> UploadFileForm\n\n<span class=\"c1\"># Imaginary function to handle an uploaded file.</span>\n<span class=\"kn\">from</span> <span class=\"nn\">somewhere</span> <span class=\"kn\">import</span> handle_uploaded_file\n\n<span class=\"k\">def</span> <span class=\"nf\">upload_file</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            handle_uploaded_file<span class=\"p\">(</span>request<span class=\"o\">.</span>FILES<span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">])</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<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        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> form<span class=\"p\">})</span>\n</code></pre></figure>\n<p>Note que temos que passar <a class=\"reference internal\" href=\"/pt-br/3.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> para o construtor do “form”; é assim que os dados do arquivo entra no form.</p>\n<p>Aqui uma maneira comum que você talvez lide com o “upload” de arquivo:</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=\"nf\">handle_uploaded_file</span><span class=\"p\">(</span>f<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> destination<span class=\"p\">:</span>\n        <span class=\"k\">for</span> chunk <span class=\"ow\">in</span> f<span class=\"o\">.</span>chunks<span class=\"p\">():</span>\n            destination<span class=\"o\">.</span>write<span class=\"p\">(</span>chunk<span class=\"p\">)</span>\n</code></pre></div>\n<p>Fazendo “loops” sobre <code class=\"docutils literal notranslate\">UploadedFile.chunks()</code> ao invés de usar o <code class=\"docutils literal notranslate\">read()</code> garante que grandes arquivos não vão forçar a memória do seu sistema.</p>\n<p>Existem alguns outros métodos e atributos disponíveis nos objetos <code class=\"docutils literal notranslate\">UploadedFile</code>; veja a <a class=\"reference internal\" href=\"/pt-br/3.0/ref/files/uploads/#django.core.files.uploadedfile.UploadedFile\" title=\"django.core.files.uploadedfile.UploadedFile\"><code class=\"xref py py-class docutils literal notranslate\">UploadedFile</code></a> para uma completa referência.</p>\n<section id=\"handling-uploaded-files-with-a-model\">\n<h3>Lindando com o “upload” de arquivos com um modelo.<a class=\"heading-anchor\" href=\"#handling-uploaded-files-with-a-model\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você está usando um arquivo em uma <a class=\"reference internal\" href=\"/pt-br/3.0/ref/models/instances/#django.db.models.Model\" title=\"django.db.models.Model\"><code class=\"xref py py-class docutils literal notranslate\">Model</code></a> com uma <a class=\"reference internal\" href=\"/pt-br/3.0/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a>, usando uma <a class=\"reference internal\" href=\"/pt-br/3.0/topics/forms/modelforms/#django.forms.ModelForm\" title=\"django.forms.ModelForm\"><code class=\"xref py py-class docutils literal notranslate\">ModelForm</code></a> faz este processo bem mais fácil. O objeto arquivo será salvo em um local especificado pelo argumento <a class=\"reference internal\" href=\"/pt-br/3.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\">upload_to</code></a> do <a class=\"reference internal\" href=\"/pt-br/3.0/ref/models/fields/#django.db.models.FileField\" title=\"django.db.models.FileField\"><code class=\"xref py py-class docutils literal notranslate\">FileField</code></a> correspondente quando chamar <code class=\"docutils literal notranslate\">form.save()</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> ModelFormWithFileField\n\n<span class=\"k\">def</span> <span class=\"nf\">upload_file</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> ModelFormWithFileField<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            <span class=\"c1\"># file is saved</span>\n            form<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<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        form <span class=\"o\">=</span> ModelFormWithFileField<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> form<span class=\"p\">})</span>\n</code></pre></div>\n<p>If you are constructing an object manually, you can assign the file object from\n<a class=\"reference internal\" href=\"/pt-br/3.0/ref/request-response/#django.http.HttpRequest.FILES\" title=\"django.http.HttpRequest.FILES\"><code class=\"xref py py-attr docutils literal notranslate\">request.FILES</code></a> to the file field in the\nmodel:</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=\"nn\">django.http</span> <span class=\"kn\">import</span> HttpResponseRedirect\n<span class=\"kn\">from</span> <span class=\"nn\">django.shortcuts</span> <span class=\"kn\">import</span> render\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> UploadFileForm\n<span class=\"kn\">from</span> <span class=\"nn\">.models</span> <span class=\"kn\">import</span> ModelWithFileField\n\n<span class=\"k\">def</span> <span class=\"nf\">upload_file</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    <span class=\"k\">if</span> request<span class=\"o\">.</span>method <span class=\"o\">==</span> <span class=\"s1\">&#39;POST&#39;</span><span class=\"p\">:</span>\n        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">(</span>request<span class=\"o\">.</span>POST<span class=\"p\">,</span> request<span class=\"o\">.</span>FILES<span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            instance <span class=\"o\">=</span> ModelWithFileField<span class=\"p\">(</span>file_field<span class=\"o\">=</span>request<span class=\"o\">.</span>FILES<span class=\"p\">[</span><span class=\"s1\">&#39;file&#39;</span><span class=\"p\">])</span>\n            instance<span class=\"o\">.</span>save<span class=\"p\">()</span>\n            <span class=\"k\">return</span> HttpResponseRedirect<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        form <span class=\"o\">=</span> UploadFileForm<span class=\"p\">()</span>\n    <span class=\"k\">return</span> render<span class=\"p\">(</span>request<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> form<span class=\"p\">})</span>\n</code></pre></div>\n</section>\n<section id=\"uploading-multiple-files\">\n<h3>Enviando múltiplos arquivos<a class=\"heading-anchor\" href=\"#uploading-multiple-files\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Se você quer enviar múltiplos arquivos usando um campo de modelo, defina o atributo HTML <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>multiple``do “widget” do campo:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">forms.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django</span> <span class=\"kn\">import</span> forms\n\n<span class=\"k\">class</span> <span class=\"nc\">FileFieldForm</span><span class=\"p\">(</span>forms<span class=\"o\">.</span>Form<span class=\"p\">):</span>\n    file_field <span class=\"o\">=</span> forms<span class=\"o\">.</span>FileField<span class=\"p\">(</span>widget<span class=\"o\">=</span>forms<span class=\"o\">.</span>ClearableFileInput<span class=\"p\">(</span>attrs<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>E então sobreescreva o método <code class=\"docutils literal notranslate\">post</code> da sua subclasse de  <a class=\"reference internal\" href=\"/pt-br/3.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\">FormView</code></a> para manipular o envio de múltiplos arquivos:</p>\n<figure class=\"code-block code-block-captioned\" data-language=\"python\"><figcaption class=\"code-block-caption\">views.py</figcaption>\n<div class=\"code-block-toolbar\"><span class=\"code-block-language\">Python</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 code\"><code><span class=\"kn\">from</span> <span class=\"nn\">django.views.generic.edit</span> <span class=\"kn\">import</span> FormView\n<span class=\"kn\">from</span> <span class=\"nn\">.forms</span> <span class=\"kn\">import</span> FileFieldForm\n\n<span class=\"k\">class</span> <span class=\"nc\">FileFieldView</span><span class=\"p\">(</span>FormView<span class=\"p\">):</span>\n    form_class <span class=\"o\">=</span> FileFieldForm\n    template_name <span class=\"o\">=</span> <span class=\"s1\">&#39;upload.html&#39;</span>  <span class=\"c1\"># Replace with your template.</span>\n    success_url <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=\"nf\">post</span><span class=\"p\">(</span><span class=\"bp\">self</span><span class=\"p\">,</span> request<span class=\"p\">,</span> <span class=\"o\">*</span>args<span class=\"p\">,</span> <span class=\"o\">**</span>kwargs<span class=\"p\">):</span>\n        form_class <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_form_class<span class=\"p\">()</span>\n        form <span class=\"o\">=</span> <span class=\"bp\">self</span><span class=\"o\">.</span>get_form<span class=\"p\">(</span>form_class<span class=\"p\">)</span>\n        files <span class=\"o\">=</span> request<span class=\"o\">.</span>FILES<span class=\"o\">.</span>getlist<span class=\"p\">(</span><span class=\"s1\">&#39;file_field&#39;</span><span class=\"p\">)</span>\n        <span class=\"k\">if</span> form<span class=\"o\">.</span>is_valid<span class=\"p\">():</span>\n            <span class=\"k\">for</span> f <span class=\"ow\">in</span> files<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>form_valid<span class=\"p\">(</span>form<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>form_invalid<span class=\"p\">(</span>form<span class=\"p\">)</span>\n</code></pre></figure>\n</section>\n</section>\n<section id=\"upload-handlers\">\n<h2>Manipuladores de envios de arquivos<a class=\"heading-anchor\" href=\"#upload-handlers\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h2>\n<p>Quando um usuário envia um arquivo, o Django passa os dados do arquivo para um * manipular de envio de arquivo* – uma pequena classe que lida com dados de arquivos enquanto este é enviado. Manipuladores de envio de arquivo não inicialmente definidos na definição <a class=\"reference internal\" href=\"/pt-br/3.0/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\">FILE_UPLOAD_HANDLERS</code></a> o qual tem como padrão:</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>Juntos as classes class:MemoryFileUploadHandler e <a class=\"reference internal\" href=\"/pt-br/3.0/ref/files/uploads/#django.core.files.uploadhandler.TemporaryFileUploadHandler\" title=\"django.core.files.uploadhandler.TemporaryFileUploadHandler\"><code class=\"xref py py-class docutils literal notranslate\">TemporaryFileUploadHandler</code></a> fornecem ao Django um comportamento padrão para o envio de arquivos  que lê arquios pequenos na memória e grandes arquivos no disco.</p>\n<p>Você pode escrever manipuladores que personalizem a maneira como Django lida com arquivos. Você pode por exemplo, usar manipuladores personalizados para forçar quotas no nível do usuário, comprimir dados enquanto chegam, renderizar barras de progresso, e mesmo enviar dados diretamente para um outro local de armazenamento sem armazenar localmente. Para maiores detalhes veja o <a class=\"reference internal\" href=\"/pt-br/3.0/ref/files/uploads/#custom-upload-handlers\"><span class=\"std std-ref\">Writing custom upload handlers</span></a>  para saber como você  pode personalizar ou mudar completamente o comportamento do envio.</p>\n<section id=\"where-uploaded-data-is-stored\">\n<h3>Onde os dados de arquivos enviados são armazenados<a class=\"heading-anchor\" href=\"#where-uploaded-data-is-stored\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Antes que você salve os arquivos enviados, os dados precisam ser salvos em algum lugar.</p>\n<p>Por padrão, se um arquivo enviado é menor que 2.5 megabytes, o Django irá manter todo o conteúdo do arquivo em memória. Isso significa que salvar o arquivo envolve somente uma leitura na memória e uma escrita no disco e portanto muito rápido.</p>\n<p>Porém, se o arquivo enviado é muito grande, o Django irá escrever o arquivo enviado em um arquivo temporário no diretório de arquivos temporários do seu sistema. Em uma plataforma Unix isso significa que você pode esperar que o Django crie um arquivo cujo o nome seja algo como /tmp/tmpzfp6I6.upload`. Se o arquivo enviado é grande o bastante, você pode assistir o arquivo crescer em tamanho enquanto o Django transmite o dado para o disco.</p>\n<p>These specifics – 2.5 megabytes; <code class=\"docutils literal notranslate\">/tmp</code>; etc. – are “reasonable defaults”\nwhich can be customized as described in the next section.</p>\n</section>\n<section id=\"changing-upload-handler-behavior\">\n<h3>Mudando o comportamento do manipulador de envio de arquivos<a class=\"heading-anchor\" href=\"#changing-upload-handler-behavior\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>Existem algumas definições que controla como o manipulador de envio de arquivo do Django se comporta. Para detalhes veja o <a class=\"reference internal\" href=\"/pt-br/3.0/ref/settings/#file-upload-settings\"><span class=\"std std-ref\">Definições de envio de arquivos</span></a>.</p>\n</section>\n<section id=\"modifying-upload-handlers-on-the-fly\">\n<span id=\"id1\"></span><h3>Modificando manipuladores de envio de arquivos durante a execução<a class=\"heading-anchor\" href=\"#modifying-upload-handlers-on-the-fly\"><span class=\"visually-hidden\">Link para este cabeçalho</span><span aria-hidden=\"true\">#</span></a></h3>\n<p>As vezes uma “view” em particular requer um comportamento diferente para o envio de arquivos. Neste caso, você pode sobrescrever um manipulador baseado no “request” modificando o <code class=\"docutils literal notranslate\">request.upload_handlers</code>. Por padrão, esta lista contém os manipuladores informados pelo <a class=\"reference internal\" href=\"/pt-br/3.0/ref/settings/#std-setting-FILE_UPLOAD_HANDLERS\"><code class=\"xref std std-setting docutils literal notranslate\">FILE_UPLOAD_HANDLERS</code></a>, mas você pode modificar essa lista como qualquer outra lista.</p>\n<p>Por exemplo, suponha que você tenha escrito um <code class=\"docutils literal notranslate\">ProgressBarUploadHandler</code> que dá um retorno sobre o progresso do envio do arquivo para algum tipo de “widget” AJAX. Você adicionaria este manipulador a sua lista de manipuladores como aqui:</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>request<span class=\"o\">.</span>upload_handlers<span class=\"o\">.</span>insert<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">))</span>\n</code></pre></div>\n<p>Você provavelmente poderia querer usar o <code class=\"docutils literal notranslate\">list.insert()</code> neste caso (no lugar de <code class=\"docutils literal notranslate\">append()</code>) porque o manipulador de barra de progresso precisa rodar <em>antes</em> de qualquer outro. Lembre-se, os manipuladores de envio de arquivo são processados na ordem.</p>\n<p>If you want to replace the upload handlers completely, you can assign a new\nlist:</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>request<span class=\"o\">.</span>upload_handlers <span class=\"o\">=</span> <span class=\"p\">[</span>ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">)]</span>\n</code></pre></div>\n<aside class=\"admonition admonition-note\" role=\"note\">\n<p class=\"admonition-title\">Nota</p>\n<p>Você só pode modificar manipuladores de envio <em>antes</em> de acessar <code class=\"docutils literal notranslate\">request.POST</code> ou <code class=\"docutils literal notranslate\">request.FILES</code>– não faz sentido mudar o manipulador de arquivos depois que o tratamento do envio já iniciou. Se você tentar modificar o <code class=\"docutils literal notranslate\">request.upload_handlers</code> depois da leitura do <a href=\"#id1\"><span class=\"problematic\" id=\"id2\">``</span></a>request.POST``ou <a href=\"#id3\"><span class=\"problematic\" id=\"id4\">``</span></a>request.FILES``o Django irá emitir um erro.</p>\n<p>Então, você deve sempre modificar os manipuladores de arquivos  tão cedo quanto possível nas suas “views”.</p>\n<p>Além disso, o <code class=\"docutils literal notranslate\">request.POST</code> é acessado pela <a class=\"reference internal\" href=\"/pt-br/3.0/ref/middleware/#django.middleware.csrf.CsrfViewMiddleware\" title=\"django.middleware.csrf.CsrfViewMiddleware\"><code class=\"xref py py-class docutils literal notranslate\">CsrfViewMiddleware</code></a> a qual está habilitada por padrão. Isso significa que você precisa usar o <a class=\"reference internal\" href=\"/pt-br/3.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\">csrf_exempt()</code></a> na sua “view”para que seja possível mudar os manipuladores de arquivos. Você precisará então do <a class=\"reference internal\" href=\"/pt-br/3.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\">csrf_protect()</code></a> na função que realmente processa a requisição.  Note que isso significa que o manipulador de envio do arquivo começa a receber o arquivo antes que as verificações de CSRF sejam feitas. Exemplo de código:</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=\"nn\">django.views.decorators.csrf</span> <span class=\"kn\">import</span> csrf_exempt<span class=\"p\">,</span> csrf_protect\n\n<span class=\"nd\">@csrf_exempt</span>\n<span class=\"k\">def</span> <span class=\"nf\">upload_file_view</span><span class=\"p\">(</span>request<span class=\"p\">):</span>\n    request<span class=\"o\">.</span>upload_handlers<span class=\"o\">.</span>insert<span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">,</span> ProgressBarUploadHandler<span class=\"p\">(</span>request<span class=\"p\">))</span>\n    <span class=\"k\">return</span> _upload_file_view<span class=\"p\">(</span>request<span class=\"p\">)</span>\n\n<span class=\"nd\">@csrf_protect</span>\n<span class=\"k\">def</span> <span class=\"nf\">_upload_file_view</span><span class=\"p\">(</span>request<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":"Básico sobre upload de arquivos","anchor":"basic-file-uploads","children":[{"title":"Lindando com o “upload” de arquivos com um modelo.","anchor":"handling-uploaded-files-with-a-model","children":[]},{"title":"Enviando múltiplos arquivos","anchor":"uploading-multiple-files","children":[]}]},{"title":"Manipuladores de envios de arquivos","anchor":"upload-handlers","children":[{"title":"Onde os dados de arquivos enviados são armazenados","anchor":"where-uploaded-data-is-stored","children":[]},{"title":"Mudando o comportamento do manipulador de envio de arquivos","anchor":"changing-upload-handler-behavior","children":[]},{"title":"Modificando manipuladores de envio de arquivos durante a execução","anchor":"modifying-upload-handlers-on-the-fly","children":[]}]}],"breadcrumbs":[{"docname":"topics/index","title":"Usando o Django","url":"/pt-br/3.0/topics/"},{"docname":"topics/http/index","title":"Tratando requisições HTTP","url":"/pt-br/3.0/topics/http/"}],"prev":{"docname":"topics/http/decorators","title":"“Decorators” para “view”","url":"/pt-br/3.0/topics/http/decorators/"},"next":{"docname":"topics/http/shortcuts","title":"Funções de atalho do Django","url":"/pt-br/3.0/topics/http/shortcuts/"},"formats":{"html":"/pt-br/3.0/topics/http/file-uploads/","markdown":"/pt-br/3.0/topics/http/file-uploads.md","json":"/pt-br/3.0/topics/http/file-uploads.json"},"source":"https://github.com/django/django/blob/stable/3.0.x/docs/topics/http/file-uploads.txt","official":"https://docs.djangoproject.com/pt-br/3.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"]}