Загрузить и изменить размер нескольких изображений в Laravel
Помимо этого блога, у меня есть канал на YouTube, где я делюсь видеоуроками. Недавно один из подписчиков канала YouTube спросил об изменении размера нескольких изображений в Laravel. Они хотят изменить размер нескольких изображений за один раз. В этой статье мы изучаем, как загружать и изменять размер нескольких изображений в Laravel.
Intervention Image – это библиотека с открытым исходным кодом, которая позволяет нам манипулировать изображениями. Я собираюсь использовать эту библиотеку для изменения размера изображений.
Начиная
Для достижения нашей цели вам необходимо установить и настроить библиотеку Intervention Image в проект Laravel. Откройте терминал в корневом каталоге вашего проекта и выполните команду:
composer require intervention/image
После того, как библиотека установлена, откройте config/app.php
файл и добавьте в него поставщиков услуг, фасад. Добавьте поставщиков услуг для этого пакета в $providers
массив.
InterventionImageImageServiceProvider::class,
Добавьте фасад в $aliases
массив.
'Image' => InterventionImageFacadesImage::class,
Далее нам нужен каталог, в котором мы храним наши загруженные файлы. Файловая система Laravel предоставляет общедоступный диск для хранения файлов. Публичный диск содержит файлы, которые общедоступны. Вы найдете загруженные файлы в storage/app/public
папке. Чтобы получить доступ к этим файлам в Интернете, вам необходимо создать символическую ссылку с public/storage
на storage/app/public
.
Создайте символическую ссылку с помощью команды:
php artisan storage:link
Эта команда создаст папку хранения в общедоступном каталоге. Здесь мы храним наши файлы.
Загрузить и изменить размер изображений в Laravel
Для того, чтобы загружать файлы на сервер, вам нужна форма. Давайте создадим форму, в которой вы можете выбрать несколько файлов для загрузки на сервер. Ниже приведен пример кода формы, которая войдет в ваш файл представления.
<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>
В форме я взял имя входного файла как ‘profile_image []’, которое отправляет массив файлов на сервер. Кроме того, я добавил атрибут «несколько», который позволяет нам выбирать несколько файлов. Замените заполнитель ROUTE_URL своим фактическим значением.
Поскольку нам нужно загрузить и изменить размер изображений, в контроллере добавьте два фасада, как показано ниже.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use Image; //Intervention Image
use IlluminateSupportFacadesStorage; //Laravel Filesystem
class ImageController extends Controller
{
}
Добавляя фасад, вы можете вызывать функции изменения размера библиотеки Intervention Image. В приведенном ниже коде я загружу файлы в два места. Один из них – исходное изображение. Второй находится в каталоге эскизов. Сначала мы загружаем исходное изображение в папку эскизов, а затем изменяем его размер.
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.");
}
}
Здесь мы пропорционально изменяем размер изображения. При этом мы сохраняем соотношение сторон, и изображение не будет обрезано. Я передаю ширину как 400 и высоту как 150. Вы можете изменить эти значения в соответствии с вашими требованиями.
Идите и проверьте это. Вы получите версию загруженных изображений с измененным размером в каталоге storage / profile_images / thumbnail.
Если вы ищете жесткий урожай, замените строки ниже
$img = Image::make($thumbnailpath)->resize(400, 150, function($constraint) {
$constraint->aspectRatio();
});
$img->save($thumbnailpath);
С участием
$img = Image::make($thumbnailpath)->resize(100, 100)->save($thumbnailpath);
Надеюсь, вы понимаете, как загружать и изменять размер нескольких изображений в Laravel. Пожалуйста, поделитесь своими мыслями и предложениями в разделе комментариев ниже.
Статьи по Теме
- Как загрузить файл на S3 с помощью файловой системы Laravel
- Как сделать резервную копию приложения Laravel
- Как интегрировать новостную рассылку MailChimp в приложение Laravel