Автоматическое определение формата изображения в PHP

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
22
0
17 883
7

Ответы 7

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

kender@eira:~$ file a
a: JPEG image data, EXIF standard 2.2

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

Вы можете попробовать finfo_file(), по-видимому, улучшенную версию mime_content_type().

Обновлено: ОК, getimagesize() лучше ..

Используйте 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.'; }

Во-первых, нет проверки на наличие расширений jpeg, jpe, jif и jfif. Хотя это редкость, они все еще используются некоторыми людьми (хотя в основном jpeg). Более того, расширение не обязательно отражает формат изображения, и загрузка файла PHP с расширением JPG может быть фатальной, если веб-сайт уязвим для включения локального файла.

Steen Schütt 03.02.2014 22:25

@TimeSheep Расширения jif, jifif и jpe можно без проблем преобразовать в jpeg в любое время, просто переименовав их. jif короче jifif из-за того, что старая система Windows не могла распознавать 4-значные расширения. Так что это не будет проблемой, как .gif .svg .png .psd (простые многослойные psd-файлы можно просматривать в браузере) ... Любая хорошая логика WhiteHorse, так держать: D

The Bumpaster 20.07.2016 00:23

Если бы я думал, что формат важен, я бы, наверное, отредактировал его :) Это просто кое-что, чтобы отметить. Более важно, что я упомянул, что end(explode($image_file, ".")) будет более разумным подходом, поскольку тогда вы сможете обрабатывать расширения произвольной длины. Наконец, использование try / catch на самом деле немного безопаснее, поскольку кто-то, у кого по какой-то причине есть доступ на выполнение, но не на запись, может загрузить сценарий, замаскированный под изображение, и затем выполнить его. Но это, наверное, глупый крайний случай :) Я не уверен, но getimagesize() также может предотвратить эту проблему.

Steen Schütt 10.08.2016 02:57

   //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_name argument, or FALSE if an error occurred.

Приведены примеры возвращаемых значений: text/html, image/gif, application/vnd.ms-excel.

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

Другие вопросы по теме