Carregue e redimensione várias imagens no Laravel
Além deste blog, estou executando um canal no YouTube onde compartilho os tutoriais em vídeo. Recentemente, um dos assinantes do canal do YouTube perguntou sobre o redimensionamento de várias imagens no Laravel. Eles querem redimensionar várias imagens de uma vez. Neste artigo, estudamos como fazer upload e redimensionar várias imagens no Laravel.
Intervention Image é uma biblioteca de código aberto que nos permite manipular imagens. Vou usar esta biblioteca para redimensionar imagens.
Começando
Para atingir nosso objetivo, você precisa instalar e configurar a biblioteca de Imagens de Intervenção no projeto Laravel. Abra o terminal no diretório raiz do seu projeto e execute o comando:
composer require intervention/image
Assim que a biblioteca estiver instalada, abra o config/app.php
arquivo e adicione provedores de serviço, fachada nele. Adicione os provedores de serviço deste pacote ao $providers
array.
InterventionImageImageServiceProvider::class,
Adicione a fachada ao $aliases
array.
'Image' => InterventionImageFacadesImage::class,
Em seguida, precisamos de um diretório onde armazenamos nossos arquivos carregados. O Laravel Filesystem fornece um disco público para armazenar os arquivos. O disco público contém arquivos que podem ser acessados publicamente. Você encontrará os arquivos carregados na storage/app/public
pasta. Para acessar esses arquivos na web, você precisa criar um link simbólico de public/storage
para storage/app/public
.
Crie um link simbólico usando o comando:
php artisan storage:link
Este comando criaria uma pasta de armazenamento no diretório público. É aqui que armazenamos nossos arquivos.
Carregar e redimensionar imagens no Laravel
Para fazer upload de arquivos em um servidor, você precisa de um formulário. Vamos criar um formulário onde você pode selecionar vários arquivos para carregar em um servidor. Abaixo está um exemplo de código do formulário que irá dentro do seu arquivo de visualização.
<form action="{{ url('ROUTE HERE') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image[]" id="exampleInputFile" multiple />
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
No formulário, peguei um nome de entrada de arquivo como ‘profile_image []’ que envia uma matriz de arquivos para o servidor. Além disso, adicionei um atributo ‘múltiplo’ que nos permite selecionar vários arquivos. Substitua o marcador ROUTE_URL pelo seu valor real.
Como precisamos fazer o upload e redimensionar as imagens, no controlador adicione duas fachadas da seguinte forma.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Image; //Intervention Image
use IlluminateSupportFacadesStorage; //Laravel Filesystem
class ImageController extends Controller
{
}
Ao adicionar a fachada, você pode chamar as funções de redimensionamento da biblioteca de imagens de intervenção. No código abaixo, irei carregar os arquivos em dois lugares. Um é a imagem original. O segundo está no diretório de miniaturas. Primeiro carregamos a imagem original na pasta de miniaturas e depois a redimensionamos.
public function store(Request $request)
{
if ($request->hasFile('profile_image')) {
foreach($request->file('profile_image') as $file){
//get filename with extension
$filenamewithextension = $file->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $file->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.uniqid().'.'.$extension;
Storage::put('public/profile_images/'. $filenametostore, fopen($file, 'r+'));
Storage::put('public/profile_images/thumbnail/'. $filenametostore, fopen($file, 'r+'));
//Resize image here
$thumbnailpath = public_path('storage/profile_images/thumbnail/'.$filenametostore);
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
}
return redirect('ROUTE_URL')->with('success', "Image uploaded successfully.");
}
}
Aqui estamos redimensionando a imagem proporcionalmente. Fazendo isso, mantemos a proporção da imagem e a imagem não é cortada. Estou passando a largura como 400 e a altura como 150. Você pode alterar esses valores de acordo com sua necessidade.
Vá em frente e teste. Você obterá a versão de redimensionamento das imagens carregadas no diretório ‘storage / profile_images / thumbnail’.
Se você está procurando um corte difícil, substitua as linhas abaixo
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
Com
$img = Image::make($thumbnailpath)->resize(100, 100)->save($thumbnailpath);
Espero que você entenda como fazer o upload e redimensionar várias imagens no Laravel. Por favor, compartilhe seus pensamentos e sugestões na seção de comentários abaixo.
Artigos relacionados
- Como fazer upload de arquivo para S3 usando o sistema de arquivos Laravel
- Como fazer backup do aplicativo Laravel
- Como integrar o boletim informativo MailChimp no aplicativo Laravel