Laravel Storage: upload de arquivos de forma simples e correta

Thiago Alves • 18/04/2020

Em qualquer sistema é muito comum que haja alguma manipulação de arquivos. Desde fotos para um site até relatórios confidenciais em PDF.

A forma como o Laravel trabalha essa questão é incrivelmente simples. Basicamente, se você usar a estrutura que o framework disponibiliza, dificilmente terá problemas com isso.

Criei um projeto para usarmos como exemplo. Segue o link do repositório: thiagoalves-dev/laravel-storage-example.

Fiz um HTML bem simples para simular um formulário onde será feito o upload de uma foto de perfil de usuário.

<!-- home.blade.php -->

<form action="/store" method="post" enctype="multipart/form-data">
    @csrf
    <input name="profile_image" type="file">
    <button type="submit">Submit</button>
</form>

Salvando o arquivo como privado

Neste caso a imagem só ficará acessível implementando uma funcionalidade que permita isso. Seja de exibição ou download.

// HomeController

public function store(Request $request)
{
    $request->file('profile_image')->store('/');
}

Salvando o arquivo como público

Neste caso a imagem ficará acessível a qualquer um, basta saber como acessá-la.

// HomeController

public function store(Request $request)
{
    $request->file('profile_image')->store('/', 'public');
}

O Laravel já vem com a pasta storage/app/public configurada.

// config/filesystems.php

'public' => [
    'driver' => 'local',
    'root' => storage_path('app/public'),
    'url' => env('APP_URL').'/storage',
    'visibility' => 'public',
]

É preciso criar um symlink dentro do diretório público do Laravel para tornar seus arquivos públicos acessíveis pela URL do navegador.

Use o seguinte comando: php artisan storage:link.

Resultado do comando anterior

Resultado final:

Visualização de uma imagem pública pelo navegador

Nos vemos em breve!

Thiago Alves

Thiago Alves

Analista de Sistemas, no mercado de desenvolvimento de software desde 2011. Especialista em PHP, Laravel e Vue.js.

Comente abaixo o que você achou deste post, se ficou com alguma dúvida ou se gostaria de sugerir algum assunto.