26.11.2017, 14:28
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Что только GIF? А если будет не этот формат?
|
|
26.11.2017, 14:37
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Пользователь может загрузить только файлы с расширением png, jpg и gif (который в приоритете), на выходе получиться только gif. Читала, что и в целях безопасности это помогает. Читала, что и использование copy, не рекомендуется, но без примеров и указания в каких именно случаях. Посчитала, что в данном случае, это приемлемо, т.к. не увидела "подводных камней" (хотя, это и не говорит о том, что их там нет).
|
|
26.11.2017, 14:50
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сохранить JPEG, а тем более PNG в GIF, это урезать изображение до безобразия, да еще все и вслепую.
Если к изображению и "приклеят" непотребное, то от exif можно и избавиться, это не проблема. И сам по себе код вклеенный не выполнится, нужен "помощник".
Если загрузка по ссылке, то так (используя GD):
if($im = imagecreatefromstring(file_get_contents('url'))) {
//обработка изображения $im, можно уменьшить его на один пиксель по ширине/высоте,
//все что вклеили будет удалено
//можно узнать палитру изображения, если индексированная, то сохранять в GIF
//иначе сохранять как JPEG
//все это функциями GD
//стоит учесть, что если GIF анимация, то она будет утеряна, сохранится только первый ее кадр
} else {
//мусор
}
|
|
26.11.2017, 15:01
|
Кандидат Javascript-наук
|
|
Регистрация: 04.11.2017
Сообщений: 117
|
|
<?php
$addrImage = 'https://javascript.ru/forum/images/ca_serenity/misc/logo.gif';
$testImage = exif_imagetype($addrImage);
if ($testImage > 0 AND $testImage < 18) echo 'Данный файл изображение';
так можно и сделать что-бы корректно расширение создавалось, не наугад, а какое должно быть.
|
|
26.11.2017, 15:05
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
laimas, спасибо, но дело в том, что это, как раз и есть анимированная картинка, поэтому ... Переформатирование картинок из png и jpg, не столь разительно в данном случае, поэтому особой роли не играет, тем более, что пользователь об этом предупрежден.
|
|
26.11.2017, 15:20
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Sonya
|
это, как раз и есть анимированная картинка
|
Тогда не проблема, открыли изображение из строки, узнали палитру - если truecolor, значит сохранили посредством GD. Exif при этом не сохраняется, а если вклеили в тело (есть умельцы), то можно изменить размер.
В противном случае сохраняем как GIF - file_put_contents(скачанное посредством file_get_contents).
imagecreatefromstring здесь для того, чтобы отсеять мусор. Имейте ввиду и возможные большие размеры, это будет проблемой уже для file_get_contents, не говоря уже о GD.
Если у вас на хосте доступен ImageMagick, то все операции лучше проделать в нем, он на гораздо большее способен, чем GD, включая и поддержку GIF анимации. GD же ее непосредственно не поддерживает, хотя можно и в нем, но писать свое уже.
|
|
26.11.2017, 15:22
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
Lion777,
exif_imagetype - определяет расширение файла?
|
|
26.11.2017, 15:25
|
Профессор
|
|
Регистрация: 07.07.2016
Сообщений: 281
|
|
laimas,
Спасибо, буду пробовать.
|
|
26.11.2017, 15:26
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Sonya
|
определяет расширение файла?
|
Определяет тип файла, но не надейтесь на это, эта функция считывает начальные байты и проверяет их сигнатуру. А речь то идет о подделке.
imagecreatefromstring же, пытается открыть ресурс из строки, если прислали не изображение, то вернет false.
Последний раз редактировалось laimas, 26.11.2017 в 15:29.
|
|
26.11.2017, 15:27
|
Кандидат Javascript-наук
|
|
Регистрация: 04.11.2017
Сообщений: 117
|
|
по сигнатуре определяет тип файла, только изображения, посмотрите на php.net синтаксис.
|
|
|
|