Загрузка и сжатие нескольких изображений в PHP
Недавно один из наших читателей спросил, как загрузить и сжать несколько изображений в PHP. Есть определенные сценарии, когда нам нужно разрешить пользователям загружать несколько изображений. Всегда рекомендуется оптимизировать изображения во время загрузки. В этой статье мы изучаем загрузку нескольких изображений и способы сжатия изображений в процессе загрузки.
Почему нам нужно уменьшить размер файла изображения?
Несомненно, изображения играют важную роль на вашем сайте. Броские изображения привлекают внимание читателей, и они проводят на сайте больше времени. Но в то же время изображения большого размера замедляют работу вашего сайта. Поскольку требуется большая пропускная способность, вашему веб-сайту требуется больше времени для загрузки веб-страниц. Владельцы сайта должны обратить внимание на уменьшение размера файла изображения и использовать для этого лучший инструмент сжатия изображений.
Я собираюсь показать вам 2 способа сжатия изображений – TinyPNG и пакет artisansweb / image-optimizer.
TinyPNG – один из популярных сервисов сжатия изображений в Интернете. Этот сервис позволяет бесплатно сжимать 500 изображений в месяц через их API. За более чем 500 изображений нужно заплатить.
Если вам нужно оптимизировать более 500 изображений в месяц и вы не хотите платить, используйте пакет artisansweb / image-optimizer. Этот пакет использует сервис reSmush.it для оптимизации изображений.
Я бы рекомендовал попробовать оба решения, сравнить результат и выбрать тот, который вам подходит.
Сказав это, давайте посмотрим, как сжимать изображения после их загрузки.
Начало работы с TinyPNG
Для начала вам нужно получить ключ API от TinyPNG. Щелкните здесь, чтобы получить ключ API. Вам просто нужно ввести свое имя и адрес электронной почты, и вы получите электронное письмо для вашего ключа.
Получив ключ разработчика, установите библиотеку PHP, предоставленную TinyPNG. Для установки библиотеки в системе должен быть установлен Composer. Откройте терминал в корневом каталоге вашего проекта и выполните команду:
composer require tinify/tinify
Как сжимать изображения с помощью TinyPNG
Как упоминалось в заголовке этой статьи, мы увидим, как загружать и сжимать несколько изображений. Для этого нам нужно создать HTML-форму с вводом файла для просмотра нескольких изображений. Создайте index.php
и поместите в него код ниже.
index.php
<form method="post" enctype="multipart/form-data" action="process_images.php">
<p>
<label>Upload Images</label>
<input type="file" name="images[]" accept="image/*" multiple>
</p>
<button type="submit" name="submit">Submit</button>
</form>
Для ввода файла я дал имя изображения []. Это связано с тем, что на стороне сервера нам нужен массив файлов, поскольку пользователь будет просматривать несколько изображений.
Когда мы просматриваем изображения и нажимаем кнопку отправки, данные формы будут отправлены в файл process_images.php
. Это файл, в котором нам нужно написать код для загрузки и сжатия изображений.
process_images.php
<?php
// Increase PHP execution time
set_time_limit(0);
require_once("vendor/autoload.php");
TinifysetKey("YOUR_API_KEY");
if (isset($_POST['submit'])) {
$supported_images = array('image/gif', 'image/jpg', 'image/jpeg', 'image/png');
if (!file_exists(getcwd(). '/uploads')) {
mkdir(getcwd(). '/uploads', 0777);
}
foreach($_FILES['images']['name'] as $key=>$val) {
$file_name = $_FILES['images']['name'][$key];
// get file extension
$ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
// get filename without extension
$filenamewithoutextension = pathinfo($file_name, PATHINFO_FILENAME);
if (in_array($_FILES['images']['type'][$key], $supported_images)) {
$filename_to_store = $filenamewithoutextension.'_'.time().'.' .$ext;
move_uploaded_file($_FILES['images']['tmp_name'][$key], getcwd().'/uploads/'.$filename_to_store);
// optimize image using TinyPNG
try {
$source = TinifyfromFile(getcwd().'/uploads/'.$filename_to_store);
$source->toFile(getcwd().'/uploads/'.$filename_to_store);
} catch(Exception $e) {
echo $e->getMessage();
exit;
}
}
}
echo "Files uploaded successfully.";
}
Обязательно замените заполнитель на ваш фактический ключ API. В приведенном выше коде мы генерируем уникальное имя файла, добавляя к нему время. После загрузки изображения на сервер мы отправляем изображение в TinyPNG API для оптимизации. Взамен мы получаем сжатую версию изображения, которую храним в том же месте и с тем же именем файла.
Сжимайте изображения с помощью пакета artisansweb / image-optimizer
Я разработал пакет Image Optimizer. Этот пакет использует внутреннюю службу reSmush.it для оптимизации изображений. Если вы ищете бесплатную услугу, попробуйте этот пакет. На сегодняшний день reSmush.it оптимизировал миллиарды изображений. Этот пакет не требует предоставления ключа или регистрации. Просто подключите его, и все готово.
Чтобы начать работу с пакетом Image Optimizer, установите его с помощью команды:
composer require artisansweb/image-optimizer
Затем код в process_image.php
файле будет изменен следующим образом.
<?php
// Increase PHP execution time
set_time_limit(0);
require_once("vendor/autoload.php");
use ArtisansWebOptimizer;
if (isset($_POST['submit'])) {
$supported_images = array('image/gif', 'image/jpg', 'image/jpeg', 'image/png');
if (!file_exists(getcwd(). '/uploads')) {
mkdir(getcwd(). '/uploads', 0777);
}
foreach($_FILES['images']['name'] as $key=>$val) {
$file_name = $_FILES['images']['name'][$key];
// get file extension
$ext = strtolower(pathinfo($file_name, PATHINFO_EXTENSION));
// get filename without extension
$filenamewithoutextension = pathinfo($file_name, PATHINFO_FILENAME);
if (in_array($_FILES['images']['type'][$key], $supported_images)) {
$filename_to_store = $filenamewithoutextension.'_'.time().'.' .$ext;
move_uploaded_file($_FILES['images']['tmp_name'][$key], getcwd().'/uploads/'.$filename_to_store);
// optimize image
try {
$img = new Optimizer();
$source = getcwd().'/uploads/'.$filename_to_store;
$img->optimize($source);
} catch(Exception $e) {
echo $e->getMessage();
exit;
}
}
}
echo "Files uploaded successfully.";
}
Надеюсь, вы понимаете, как загружать и сжимать несколько изображений в PHP. Я хотел бы услышать ваши мысли и предложения в разделе комментариев ниже.
Статьи по Теме
- Загрузка файла перетаскиванием с помощью JavaScript и PHP
- Изменение размера изображения в PHP с помощью библиотеки изображений вмешательства
- Загрузить изображение с помощью пуленепробиваемой библиотеки в PHP