Pular para conteúdo

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.

# Cria o link simbólico para tornar a pasta storage acessível
$ php artisan storage:link

📊 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

  1. Básico: Crie o link simbólico de storage e coloque uma imagem manualmente na pasta para testar o acesso via URL.
  2. 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).
  3. 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.


Próxima Aula: Filas, Eventos e Jobs