2008-10-09 5 views
16

Я ищу способ загрузить загруженное пользователем изображение, которое в настоящее время помещено во временное местоположение ex:/tmp/jkhjkh78 и создать из него php-образ, автоматически определяя формат.Автоматическое определение формата изображения в PHP

Есть ли более умный способ сделать это, чем куча try/catching с помощью imagefromjpeg, imagefrompng и т. Д.?

ответ

0

Вы можете вызвать системную команду (если вы находитесь под Linux/Unix), file если вам нравится:

[email protected]:~$ file a 
a: JPEG image data, EXIF standard 2.2 
25

Это одна из функций getimagesize. Вероятно, они должны были назвать это «getimageinfo», но для вас это PHP.

1

Используйте exif_imagetype(), если он доступен ..:

http://www.php.net/manual/en/function.exif-imagetype.php

Я уверен, что функции EXIF ​​доступны по умолчанию (т.е. вы должны специально исключить их, а не включать их отдельно) при установке php

0

Это поможет вам узнать расширение, а также результат, основанный на условии

$ image_file = 'http://foo.com/images.gif';
$ extension = substr ($ image_file, -4);
if ($ extension == ".jpg") {echo 'Свой JPG-изображение.'; } else {echo 'Не изображение JPG.'; }

+0

Прежде всего, нет проверки расширений jpeg, jpe, jif и jfif. Хотя это редкость, они все еще используются некоторыми людьми (в основном, jpeg). Более того, расширение не обязательно отражает формат изображения, и загрузка файла PHP с расширением JPG может быть фатальным, если сайт уязвим для локального включения файла. – 2014-02-03 18:25:11

3
//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 

это сделает имя изображения выглядеть круто и уникальные

0

Люди рекомендуют с помощью getimagesize() but the documentation гласит:

Внимание Эта функция ожидает имя файла является допустимым файлом изображения. Если предоставляется файл без изображения, то он может быть неправильно обнаружен как изображение , и функция вернется успешно, но массив может содержать бессмысленные значения.

Не используйте 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

Однако комментарии на официальной странице документации предупреждают, что это не следует полагаться на для проверки либо.