Este guia deomnstra como configurar uma funcionalidade de upload de arquivos em uma aplicação Django, abordando uma configruação típica e um erro comum de implementação.
Estrutura do projeto exemplo:
- meuprojeto/
- -----> aplicativo5/
- ---------> urls.py
- ---------> views.py
- -----> templates/
- ---------> formulário_upload.html
- -----> meuprojeto/
- ---------> urls.py
- -----> media/
Primeiramente, configuração das URLs do aplicativo em aplicativo5/urls.py:
from django.urls import path
from aplicativo5 import views as vistas5
nome_aplicativo = 'aplicativo5'
padroes_url = [
path('processar/', vistas5.processar_envio, name='processar_envio'),
path('exibir/', vistas5.mostrar_formulario, name='mostrar_formulario'),
]
Esta configuração define duas rotas: uma para exibir o formulário e outra para processar o upload.
Em seguida, a lógica de views em aplicativo5/views.py:
from django.shortcuts import render
from django.http import HttpResponse
import os
def mostrar_formulario(request):
return render(request, 'templates/formulario_upload.html')
def processar_envio(request):
if request.method == 'POST':
arquivo_enviado = request.FILES.get('arquivo', None)
if arquivo_enviado:
diretorio_destino = 'media/uploads'
if not os.path.exists(diretorio_destino):
os.makedirs(diretorio_destino)
caminho_completo = os.path.join(diretorio_destino, arquivo_enviado.name)
with open(caminho_completo, 'wb+') as destino:
for bloco in arquivo_enviado:
destino.write(bloco)
return HttpResponse('Upload concluído com sucesso!')
else:
return HttpResponse('Nenhum arquivo foi selecionado.')
A view processar_envio verifica se o método é POST, recupera o arquivo do request, garante que o diretório exista e salva o conteúdo em blocos para evitar problemas com memória.
O template HTML em templates/formulario_upload.html:
<form enctype="multipart/form-data" action="{% url 'aplicativo5:processar_envio' %}" method="post">
{% csrf_token %}
<input type="file" name="arquivo" />
<br/>
<input type="submit" value="Enviar" />
</form>
Um erro comum é digitar incorretamente a tag de formulário como <from> em vez de <form>. Isso impede o envio correto, pois o navegador não reconhece o elemento como um formulário funcional. Corrigindo a tag, o upload funciona como esperado.
Por fim, as URLs do projeto principal em meuprojeto/urls.py:
from django.contrib import admin
from django.urls import path, include
padroes_url_projeto = [
path('admin/', admin.site.urls),
path('meuapp/', include('aplicativo5.urls')),
]
Isso redireciona requisições para /meuapp/ para as URLs definidas no apilcativo.
Para testar, acesse http://localhost:8000/meuapp/exibir/, selecione um arquivo e clique em enviar. O sistema redirecionará para a rota de processamento e exibirá uma mensagem de sucesso.