Я ищу способ загрузить загруженное пользователем изображение, которое в настоящее время помещено во временное местоположение ex: / tmp / jkhjkh78 и создать из него php-изображение, автоматически определяя формат.
Есть ли более умный способ сделать это, чем куча try / catch с imagefromjpeg, imagefrompng и т. Д.?
Это одна из функций getimagesize . Вероятно, они должны были назвать это «getimageinfo», но для вас это PHP.
//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
это сделает имя изображения крутым и уникальным
Вы можете попробовать finfo_file (), видимо, улучшенную версию mime_content_type ().
Изменить: ОК, getimagesize () лучше ..
Используйте exif_imagetype (), если он доступен ..:
http://www.php.net/manual/en/function.exif-imagetype.php
Я уверен, что exif-функции доступны по умолчанию (т. Е. Вы должны специально исключать их, а не включать их отдельно) при установке php
Вы можете вызвать системную команду (если вы находитесь под linux / unix), file
если хотите:
kender@eira:~$ file a a: JPEG image data, EXIF standard 2.2
Это поможет вам узнать расширение, а также результат, основанный на условии
$ image_file = ' http://img.ruphp.com/format/images.gif ';
$ extension = substr ($ image_file, -4);
if ($ extension == ".jpg") {echo 'Свой JPG-изображение.'; } else {echo 'Не изображение JPG.'; }
Люди рекомендуют использовать 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
Однако комментарии на странице официальной документации предупреждают, что для проверки также не следует полагаться.