Aula 13 - Upload de Arquivos e Storage 📂
🎯 Objetivo da Aula
Aprender a gerenciar arquivos no Laravel de forma segura e escalável. Vamos explorar o sistema de Filesystem, realizar uploads de imagens com validação e entender a diferença entre armazenamento local e em nuvem (S3).
🏗️ O Sistema de Storage
O Laravel fornece uma camada de abstração que permite que você mude de "armazenamento local" para "Amazon S3" mudando apenas uma linha no arquivo .env.
Configuração
O arquivo de configuração é o config/filesystems.php. Por padrão, o disco public é usado para arquivos que devem ser acessíveis pela web.
📊 Fluxo de Upload
sequenceDiagram
participant U as Usuário
participant F as Formulário HTML
participant C as Controller
participant S as Storage (Disco)
U->>F: Seleciona arquivo
F->>C: Envia via POST (multipart)
C->>C: Valida tamanho/extensão
C->>S: Salva arquivo
S-->>C: Retorna o caminho (path)
C->>U: Exibe confirmação 💻 Implementando o Upload
No Controller, o processo é muito simples:
public function store(Request $request) {
$request->validate([
'foto' => 'required|image|mimes:jpeg,png,jpg|max:2048',
]);
if ($request->hasFile('foto')) {
$path = $request->file('foto')->store('avatares', 'public');
// Salva o $path no banco de dados
}
}
Visualizando o arquivo: {% raw %}<img src="{{ asset('storage/' . $usuario->foto) }}">
🔍 Manipulação de Imagens
Para redimensionar imagens automaticamente, recomendamos usar bibliotecas como a Intervention Image.
Dica de Performance
Nunca salve o arquivo binário diretamente no banco de dados (BLOB). Salve apenas o caminho (string) e mantenha o arquivo no sistema de arquivos.
🧠 Blocos de Destaque
Segurança
Sempre valide as extensões dos arquivos. Permitir o upload de arquivos .php ou .exe pode comprometer servidor inteiro!
🛠️ Exercícios Progressivos
- Básico: Crie o link simbólico de storage e coloque uma imagem manualmente na pasta para testar o acesso via URL.
- Intermediário: Crie um formulário que receba um PDF (currículo) e salve-o em uma pasta privada (não acessível via link simbólico).
- Desafio: Implemente uma funcionalidade que apague o arquivo antigo do disco quando o usuário enviar uma nova foto de perfil.
🚀 Mini-Projeto da Aula
Galeria de Fotos Minimalista: Desenvolva um sistema onde usuários autenticados possam subir fotos com títulos. A aplicação deve exibir uma galeria de miniaturas e permitir que o usuário baixe a imagem original através de um link seguro.