#php #image #format #jpeg
Вопрос:
Я ищу способ взять загруженное пользователем изображение, которое в настоящее время находится во временном расположении, например: /tmp/jkhjkh78, и создать из него изображение php, автоматически определяя формат.
Есть ли более умный способ сделать это, чем куча попыток/ловли с помощью imagefromjpeg, imagefrompng и т. Д.?
Ответ №1:
Это одна из функций getimagesize. Вероятно, им следовало бы назвать это «getimageinfo», но это PHP для вас.
Ответ №2:
//Image Processing
$cover = $_FILES['cover']['name'];
$cover_tmp_name = $_FILES['cover']['tmp_name'];
$cover_img_path = '/images/';
$type = exif_imagetype($cover_tmp_name);
if ($type == (IMAGETYPE_PNG || IMAGETYPE_JPEG || IMAGETYPE_GIF || IMAGETYPE_BMP)) {
$cover_pre_name = md5($cover); //Just to make a image name random and cool :D
/**
* @description : possible exif_imagetype() return values in $type
* 1 - gif image
* 2 - jpg image
* 3 - png image
* 6 - bmp image
*/
switch ($type) { #There are more type you can choose. Take a look in php manual -> http://www.php.net/manual/en/function.exif-imagetype.php
case '1' :
$cover_format = 'gif';
break;
case '2' :
$cover_format = 'jpg';
break;
case '3' :
$cover_format = 'png';
break;
case '6' :
$cover_format = 'bmp';
break;
default :
die('There is an error processing the image -> please try again with a new image');
break;
}
$cover_name = $cover_pre_name . '.' . $cover_format;
//Checks whether the uploaded file exist or not
if (file_exists($cover_img_path . $cover_name)) {
$extra = 1;
while (file_exists($cover_img_path . $cover_name)) {
$cover_name = md5($cover) . $extra . '.' . $cover_format;
$extra ;
}
}
//Image Processing Ends
это сделает название изображения крутым и уникальным
Ответ №3:
Используйте exif_imagetype()
, если это доступно ..:
http://www.php.net/manual/en/function.exif-imagetype.php
Я почти уверен, что функции exif доступны по умолчанию (т. Е. вы должны специально исключить их, а не специально включать) при установке php
Ответ №4:
Вы могли бы попробовать finfo_file()
, по-видимому, улучшенную версию mime_content_type()
.
Правка: Хорошо, getimagesize()
так лучше..
Ответ №5:
Вы можете вызвать системную команду (если вы находитесь под linux/unix), file
если хотите:
kender@eira:~$ file a
a: JPEG image data, EXIF standard 2.2
Ответ №6:
Это поможет вам узнать расширение, а также результат, основанный на условии
$image_file = ‘http://foo.com/images.gif‘;
$extension = substr($image_file, -4);
if($extension == «.jpg»){ echo ‘Это изображение в формате JPG.’; } else { echo ‘Это не изображение в формате JPG.’; }
Комментарии:
1. Во-первых, нет проверки на наличие расширений jpeg, jpe, jif и jfif. Несмотря на необычность, они все еще используются некоторыми людьми (хотя в основном jpeg). Более того, расширение не обязательно отражает формат изображения, и загрузка файла PHP с расширением JPG может быть фатальной, если веб-сайт уязвим для включения локальных файлов.
2. Расширения @TimeSheep jif, jifif и jpe могут быть преобразованы в jpeg в любое время без проблем, просто переименовав их. jif короче jifif из-за старой системы Windows, которая не могла распознать 4-значные расширения. Так что это не будет проблемой, так как .gif .svg .png .psd(простые многослойные psd можно просматривать через браузер) … Любая хорошая логика, Уайтхорс, продолжай в том же духе 😀
3. Если бы я думал, что формат имеет значение, я бы, вероятно, отредактировал его в 🙂 Это просто нужно отметить. Более важная вещь, о которой я упомянул, заключается в том, что
end(explode($image_file, "."))
это был бы более разумный подход, поскольку тогда вы сможете обрабатывать расширения произвольной длины. Наконец, использование try/catch на самом деле немного безопаснее, так как кто-то, у кого по какой-то причине есть доступ к выполнению, но нет доступа на запись, может загрузить сценарий, замаскированный под изображение, а затем выполнить его. Но это, вероятно, глупый крайний случай 🙂 Я не уверен, ноgetimagesize()
мог бы также предотвратить эту проблему.
Ответ №7:
Люди рекомендуют использовать, getimagesize()
но в документации говорится:
Внимание! Эта функция ожидает, что имя файла будет допустимым файлом изображения. Если предоставляется файл, не содержащий изображения, он может быть неправильно распознан как изображение, и функция успешно вернется, но массив может содержать бессмысленные значения.
Не используйте
getimagesize()
для проверки того, что данный файл является допустимым изображением. Вместо этого используйте специально разработанное решение, такое как расширение Fileinfo.
Соответствующая функция в расширении Fileinfo является finfo_file()
:
string finfo_file ( resource $finfo , string $file_name = NULL
[, int $options = FILEINFO_NONE [, resource $context = NULL ]] )
Возвращает текстовое описание содержимого
file_name
аргумента или значение FALSE, если произошла ошибка.
Приведенными примерами возвращаемых значений являются: text/html
, image/gif
, application/vnd.ms-excel
Однако комментарии на странице официальной документации предупреждают, что на это также не следует полагаться при проверке.