Laravel Storage: salvando arquivos no S3 da Amazon

Thiago Alves • 25/04/2020

Dias atrás demonstrei de forma simples como fazer upload de arquivos usando a classe Storage do Laravel.

Vou aproveitar o código já feito para mostrar como salvar os arquivos no AWS S3, serviço de armazenamento da Amazon.

Segue o link do repositório: thiagoalves-dev/laravel-storage-example.

Partindo do pressuposto que já tenha uma conta na AWS criada, vamos ao passo a passo:

Bucket

Em Services > Storage > S3, crie um novo bucket para armazenar os arquivos da sua aplicação.

Chaves de Acesso

No menu do seu usuário na AWS, vá em My Security Credentials. Crie uma nova Access Key e copie as chaves que forem geradas.

Configuração

O Laravel já trás por padrão as variáveis de configuração do S3, basta adicionar os dados da sua conta e bucket.

# .env

AWS_ACCESS_KEY_ID=xxxx
AWS_SECRET_ACCESS_KEY=xxxxxx
AWS_DEFAULT_REGION=us-east-2 # exemplo
AWS_BUCKET=bucket-name
// config/filesystems.php

's3' => [
    'driver' => 's3',
    'key' => env('AWS_ACCESS_KEY_ID'),
    'secret' => env('AWS_SECRET_ACCESS_KEY'),
    'region' => env('AWS_DEFAULT_REGION'),
    'bucket' => env('AWS_BUCKET'),
    'url' => env('AWS_URL'),
    'endpoint' => env('AWS_ENDPOINT'),
]

S3 Package

É preciso instalar um pacote para que a comunicação com o S3 funcione corretamente.

Não há necessidade de configuração ou codificação nesse sentido, apenas execute o seguinte comando no terminal: composer require league/flysystem-aws-s3-v3.

Tudo pronto! Agora vamos ao código.

Upload

Adicionei uma nova rota para o método que usarei o S3.

// routes/web.php

Route::post('/storeS3', 'HomeController@storeS3')->name('home.storeS3');

O segundo parâmetro do método store é o disco em que iremos salvar o arquivo. Nele passamos o "s3" e o Laravel faz o resto sozinho.

// HomeController

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

Na visualização do Bucket acesso o arquivo que fiz upload.

AWS S3 Bucket

Visualização

Existem várias formas de ter acesso aos arquivos no S3: através de download, endereços temporários, etc. Isso também vai variar de acordo com as permissões de acesso configuradas no bucket.

Abaixo, exemplifico uma rota onde passo o nome do arquivo que quero acessar e, no controller, redireciono para um endereço temporário onde é possível ver a imagem que cadastrei.

// routes/web.php

Route::get('/show-s3/{filename}', 'HomeController@showS3')->name('home.showS3');
// HomeController

public function showS3(string $filename)
{
    return redirect(
        Storage::disk('s3')
            ->temporaryUrl($filename, now()->addMinutes(5))
    );
}

Resultado final:

Visualização da imagem

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.