Como fazer upload de arquivo para S3 usando o sistema de arquivos Laravel
Recentemente, publiquei um artigo Upload de arquivos para Amazon S3 usando AWS PHP SDK. Um de nossos leitores perguntou como realizar operações de upload de arquivo AWS S3 com o Laravel. Quando se trata do Laravel, precisamos seguir um caminho diferente em comparação com o PHP. Neste artigo, estudamos como fazer upload de um arquivo para o S3 usando um sistema de arquivos Laravel.
O Laravel Filesystem fornece diferentes drivers para trabalhar com o sistema de arquivos local, Amazon S3, Rackspace, etc. Esses drivers fornecem uma maneira conveniente e fácil de enviar arquivos localmente ou na nuvem.
Amazon S3 é um serviço popular para armazenamento de imagens, arquivos e documentos. Em segundo lugar, manter seus arquivos na nuvem economizará muita largura de banda para o seu site. Ele economiza espaço de hospedagem e o desempenho da nuvem é escalonável.
Dito isso, vamos dar uma olhada em como fazer o upload de um arquivo para o S3 usando o sistema de arquivos Laravel.
Obtenha suas credenciais de segurança da AWS
Para começar a usar o S3, você deve ter uma conta no Amazon Web Services. Assim que tiver, certifique-se de ativar o serviço S3.
Depois de ativar o serviço S3, obtenha suas credenciais de segurança, que precisaremos na parte posterior do tutorial.
Configuração do driver S3 no Laravel
Como disse, irei usar o Sistema de Arquivos Laravel. Requer a configuração do driver S3. Vá até o seu editor e abra o arquivo config/filesystems.php
. Neste arquivo, você pode ver o driver definido para S3 em ‘discos’.
config / filesystems.php
<?php
return [
.....
'disks' => [
.....
'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'),
],
],
];
No código acima, o Laravel usa o método env() para definir os valores. Isso significa que você precisa definir essas constantes em seu .env
arquivo. Você não precisa definir as constantes AWS_URL e AWS_ENDPOINT, pois não é necessário para fazer upload de arquivos no bucket S3.
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
Adicione o valor a cada constante acima. Em seguida, abra o terminal no diretório raiz do seu projeto e execute o comando:
composer require league/flysystem-aws-s3-v3 ~1.0
Este comando instalará a biblioteca necessária que chama a API AWS e faz as operações na nuvem.
Carregar um arquivo para S3 no Laravel
Todos nós definimos com a configuração básica. Agora podemos ir para a parte real do upload de arquivos. Vamos criar um formulário simples com entrada de arquivo e botão de envio.
Adicione o código abaixo em seu arquivo blade.
<form action="{{ url('ROUTE_URL') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image" id="exampleInputFile">
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
Substitua o marcador ROUTE_URL pelo seu trajeto real.
O Laravel fornece uma Storage
fachada que costumava interagir com os discos configurados. Em nosso caso, o disco é S3. Adicione Storage
fachada no controlador da seguinte forma:
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
...
...
Depois de incluir uma fachada, você pode fazer upload de arquivos no S3. Escreva o código abaixo no seu método que envia o arquivo no S3.
<?php
...
...
public function store(Request $request)
{
if($request->hasFile('profile_image')) {
//get filename with extension
$filenamewithextension = $request->file('profile_image')->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $request->file('profile_image')->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.time().'.'.$extension;
//Upload File to s3
Storage::disk('s3')->put($filenametostore, fopen($request->file('profile_image'), 'r+'), 'public');
//Store $filenametostore in the database
}
}
No código acima, estou gerando um nome exclusivo para o arquivo e, em seguida, carrego-o no S3. Um usuário deve armazenar o nome do arquivo no banco de dados para uso posterior. Ao enviar um arquivo para o S3, passei o terceiro parâmetro como ‘público’. Se você não quiser definir o arquivo como ‘público’, ignore este parâmetro.
O usuário pode obter o URL do arquivo enviado usando o código:
$url = Storage::disk('s3')->url('YOUR_FILENAME_HERE');
Para excluir um arquivo do depósito S3, use o método delete conforme mostrado abaixo.
Storage::disk('s3')->delete('YOUR_FILENAME_HERE');
É tudo sobre como enviar um arquivo para o S3 usando o sistema de arquivos Laravel. Espero que você conheça o sistema disponibilizado pelo Laravel para interação com o Amazon S3. Por favor, compartilhe seus pensamentos e sugestões na seção de comentários abaixo.
Artigos relacionados
- Um guia para fazer upload e compactar imagens no Laravel
- Como fazer backup do aplicativo Laravel
- Faça backup do aplicativo Laravel no Dropbox