@DecafNickel

Загрузка картинок на сайт. Возможен ли универсальный подход?

Здравствуйте, товарищи.
Очередной вопрос - каким образом можно осуществить загрузку изображений на сайт, используя минимум кода?
На данный момент я имею приложение на php, к которому имеют доступ пользователи. Эти же самые пользователи имеют возможность загружать картинки на сервер и получать их в виде своей аватарки, как пример.
Чтобы избежать попыток стеганографии через картинки - я вручную сжимаю каждое изображение.
Выглядит это примерно так:
function picproc($file, $h, $w){
$pic = $file;
			$percent = 0.3;
				list($width, $height) = getimagesize($pic);
				$new_width = $w;
				$new_height = $h;
				$image_p = imagecreatetruecolor($new_width, $new_height);
				$image = imagecreatefromjpeg($pic);
				imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
				imagejpeg($image_p, $file, 100);
    			@unlink($ho['Upic']);
    		}


Данный пример не самый лучший, но он позволяет избежать загрузку слишком больших полотен изображения, и не позволяет злоумышленникам использовать метод стеганографии.
Главная проблема - эта функция работает исключительно с изображениями формата jpeg (imagecreatefromjpeg). И в случае, если пользователь загружает на сайт изображение, например, формата gif или png - приложение выдаёт ошибку, ибо функция imagecreatefromjpeg не работает с другими форматами.
Может быть, есть какой-то универсальный метод для сжатия изображения до определённых параметров, любого формата?

upd: во время работы над ошибкой - я пришёл к паре решений, но не уверен, подойдут ли они в конкретной ситуации, когда нужно изменить изображение, и исключить загрузку больших изображений.
1 - поставить ограничение на загрузку файлов, ибо на данный момент используется стандартное ограничение в php (не припомню уже, сколько там мбайт). На своей памяти я не помню, чтобы мне встречались огромные 200к изображения, которые весили < 5mb.
2 - добавлять на изображения какой-то логотип или вотермарк. В таком случае изображение будет изменено, но опять же - даже если использовать этот подход - придётся сталкиваться с imagecreatefrom функциями, которые для каждого формата - свои.
3 - прибегнуть к какой-то сторонней библиотеке, в которой работа с изображениями реализована попроще, но использовать что-то стороннее - крайне не хочется (стараюсь всё писать самостоятельно)
  • Вопрос задан
  • 183 просмотра
Пригласить эксперта
Ответы на вопрос 3
Compolomus
@Compolomus Куратор тега PHP
Комполом-быдлокодер
Я забирал содержимое файла картинки из массива файлов, обрабатывал через imagecreatefromstring
Далее получается такой же ресурс, следующий код не нужно переписывать
Размеры получить можно прям из ресурса, imagesx imagesy функциями
Ответ написан
Комментировать
kawabanga
@kawabanga
Есть несколько вариантов -
1) стандартная библиотека для работы с изображениями. код простой. один раз функию написали и забыли. Но кушает много памяти. (p.s. у вас ошибка в тексте >5mb, а надо наоборот).
Изображение в 3 мб может кратковременно нагружать оперативку на 500мб. малоприятно.
Но работает со всеми форматами.
https://www.php.net/manual/ru/imagick.examples-1.php

2) Использовать API сервисы , мы сейчас используем blitline. очень удобно. отправил задание, получил изображение через 3-5 секунд.

3) https://jcupitt.github.io/libvips/ , но придется потратить время на настройку.

3 - прибегнуть к какой-то сторонней библиотеке, в которой работа с изображениями реализована попроще, но использовать что-то стороннее - крайне не хочется (стараюсь всё писать самостоятельно)

Откройте для себя github. это текущая задача у вас на самом деле не очень большая, а как вы будете word в pdf конвертировать своими силами?
2 - добавлять на изображения какой-то логотип или вотермарк. В таком случае изображение будет изменено, но опять же - даже если использовать этот подход - придётся сталкиваться с imagecreatefrom функциями, которые для каждого формата - свои.

imagick умеет работать с наложением изображений. думаю и lib vips тоже умеет.

поставить ограничение на загрузку файлов, ибо на данный момент используется стандартное ограничение в php (

Загружает так пользователь через телефон картинку, а ему в ответ - извините, нужно изображение поменьше. куда ему тыкаться?
Ответ написан
FanatPHP
@FanatPHP
Чебуратор тега РНР
если пользователь загружает на сайт изображение, например, формата gif или png - приложение выдаёт ошибку

Если отвечать на вопрос буквально, то есть, как бы, imagecreatefromgif и imagecreatefrompng.
Но если это только "например", и хочется прям полной всеобъемлющей универсальности, и делать аватарки из pdf, imagick, причем лично й предпочту вызывать утилиту командной строки чем колупаться с расширением пхп
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы