Я ищу способ взять загруженное пользователем изображение, которое в настоящее время помещено во временное место, например: / tmp / jkhjkh78, и создать из него изображение php, автоматически определяя формат.
Есть ли более умный способ сделать это, чем связка попыток / отлова с помощью imagefromjpeg, imagefrompng и т. д.?






Вы можете вызвать системную команду (если вы используете linux / unix), file, если хотите:
kender@eira:~$ file a
a: JPEG image data, EXIF standard 2.2
Это одна из функций getimagesize. Возможно, им следовало назвать это «getimageinfo», но это для вас PHP.
Используйте exif_imagetype(), если он доступен ..:
http://www.php.net/manual/en/function.exif-imagetype.php
Я почти уверен, что функции exif доступны по умолчанию (т.е. вам нужно специально исключить их, а не включать) при установке php.
Это поможет вам узнать расширение, а также результат, основанный на условии.
$image_file = 'http://foo.com/images.gif';
$extension = substr($image_file, -4);
if ($extension == ".jpg"){ echo 'Its a JPG Image.'; } else { echo 'Its not a JPG Image.'; }
@TimeSheep Расширения jif, jifif и jpe можно без проблем преобразовать в jpeg в любое время, просто переименовав их. jif короче jifif из-за того, что старая система Windows не могла распознавать 4-значные расширения. Так что это не будет проблемой, как .gif .svg .png .psd (простые многослойные psd-файлы можно просматривать в браузере) ... Любая хорошая логика WhiteHorse, так держать: D
Если бы я думал, что формат важен, я бы, наверное, отредактировал его :) Это просто кое-что, чтобы отметить. Более важно, что я упомянул, что end(explode($image_file, ".")) будет более разумным подходом, поскольку тогда вы сможете обрабатывать расширения произвольной длины. Наконец, использование try / catch на самом деле немного безопаснее, поскольку кто-то, у кого по какой-то причине есть доступ на выполнение, но не на запись, может загрузить сценарий, замаскированный под изображение, и затем выполнить его. Но это, наверное, глупый крайний случай :) Я не уверен, но getimagesize() также может предотвратить эту проблему.
//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
это сделает имя изображения крутым и уникальным
Люди рекомендуют использовать getimagesize() но документация читает:
Caution This function expects filename to be a valid image file. If a non-image file is supplied, it may be incorrectly detected as an image and the function will return successfully, but the array may contain nonsensical values.
Do not use
getimagesize()to check that a given file is a valid image. Use a purpose-built solution such as the Fileinfo extension instead.
Соответствующая функция в расширении Fileinfo - finfo_file():
string finfo_file ( resource $finfo , string $file_name = NULL
[, int $options = FILEINFO_NONE [, resource $context = NULL ]] )
Returns a textual description of the contents of the
file_nameargument, or FALSE if an error occurred.
Приведены примеры возвращаемых значений: text/html, image/gif, application/vnd.ms-excel.
Однако комментарии на официальной странице документации предупреждают, что на это также не следует полагаться при валидации.
Во-первых, нет проверки на наличие расширений jpeg, jpe, jif и jfif. Хотя это редкость, они все еще используются некоторыми людьми (хотя в основном jpeg). Более того, расширение не обязательно отражает формат изображения, и загрузка файла PHP с расширением JPG может быть фатальной, если веб-сайт уязвим для включения локального файла.