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.
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:
Nos vemos em breve!
Thiago Alves
Comente abaixo o que você achou deste post, se ficou com alguma dúvida ou se gostaria de sugerir algum assunto.