php как использовать getimagesize() для проверки типа изображения при загрузке

Возможный дубликат:
GetImageSize() не возвращается FALSE, когда следует

В настоящее время у меня есть система фильтров следующим образом:

   // Check to see if the type of file uploaded is a valid image type
function is_valid_type($file)
{
    // This is an array that holds all the valid image MIME types
    $valid_types = array("image/jpg", "image/JPG", "image/jpeg", "image/bmp", "image/gif", "image/png");

    if (in_array($file['type'], $valid_types))
        return 1;
    return 0;
}

но мне сказали, что лучше проверить тип файла самостоятельно, как бы я использовал getimagesize() для проверки типа файла аналогичным образом?


person neeko    schedule 06.10.2012    source источник
comment
Внимание! Не используйте getimagesize() для проверки того, файл является допустимым изображением.   -  person    schedule 02.12.2019


Ответы (3)


getimagesize() возвращает массив из 7 элементов. Индекс 2 массива содержит одну из констант IMAGETYPE_XXX, указывающих на тип изображения.

Эквивалентом функции, предоставляемой с помощью getimagesize(), будет

function is_valid_type($file)
{
    $size = getimagesize($file);
    if(!$size) {
        return 0;
    }

    $valid_types = array(IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP);

    if(in_array($size[2],  $valid_types)) {
        return 1;
    } else {
        return 0;
    }
}
person user1704650    schedule 06.10.2012
comment
спасибо за ответ, но этот код возвращает ошибку в dreamweaver в строке if(!$size){ - person neeko; 06.10.2012
comment
В третьей строке отсутствовала точка с запятой, теперь все должно быть в порядке. - person user1704650; 06.10.2012
comment
теперь я получаю эту ошибку Предупреждение: getimagesize() ожидает, что параметр 1 будет строкой, задан массив - person neeko; 06.10.2012
comment
Вы должны передать функции is_valid_type($file) имя файла в качестве параметра. Вы, вероятно, даете ему массив $_FILES. Попробуйте что-нибудь вроде is_valid_type($file['name']). Или вы можете изменить getimagesize($file) на getimagesize($file['name']), чтобы вы могли вызывать его так же, как исходную функцию. Но поскольку функции требуется только имя файла, не имеет смысла ожидать массив. - person user1704650; 06.10.2012
comment
спасибо, но теперь я получаю эту ошибку "getimagesize (538419_10151009993941091_424169609_n.jpg) [function.getimagesize]: не удалось открыть поток: нет такого файла или каталога в..." - person neeko; 07.10.2012
comment
В данном случае ошибка вполне значима: PHP не может найти рассматриваемый файл, скорее всего, потому, что он не существует. Вы можете попробовать распечатать имя файла $file, которое вы передаете is_valid_type($file), и посмотреть, существует ли оно для вас. Я предполагаю, что загруженное изображение либо сохраняется в другую папку, либо переименовывается во время загрузки. Это зависит от вашей реализации, а не от функции is_valid_type. Тем не менее, я считаю, что когда вы вызываете is_valid_type, изображение еще не перемещено в свое окончательное местоположение: попробуйте $file['tmp_name']. - person user1704650; 07.10.2012
comment
спасибо, это прекрасно, вы мне очень помогли! - person neeko; 07.10.2012
comment
Итак, подведем итог: вышеприведенная функция используется: is_valid_type($_FILES['file']['tmp_name']) если вы проверяете данные непосредственно из массива $_FILES. Я бы хотел, чтобы мне не приходилось читать между строк, чтобы прийти к такому выводу. - person Partack; 30.01.2017

Вы можете использовать, как показано ниже

$img_info   = getimagesize($_FILES['image']['tmp_name']);
$mime   = $img_info['mime']; // mime-type as string for ex. "image/jpeg" etc.
person GBD    schedule 06.10.2012
comment
Вы тестировали этот код???? вы не можете использовать getimagesize on $_FILES['images']['tmp_name'], он вернет false - person Baba; 06.10.2012
comment
это интересно... codepad.viper-7.com/N96kma возвращает Warning: getimagesize(): Filename cannot be empty .. , это может быть проблема конкретной версии PHP - person Baba; 06.10.2012
comment
этот код подвержен внедрению PHP Exif. - person prospector; 19.06.2020

Сначала проверьте, возвращает ли getimagesize false. Если это так, то файл не является распознаваемым форматом изображения (или вообще не является изображением).

В противном случае получите индекс 2 возвращаемого массива и пропустите его через image_type_to_mime_type. Это вернет строку типа "image/gif" и т. д. Подробнее см. в документах. больше информации.

person Niet the Dark Absol    schedule 06.10.2012