getimagesize () vs finfo_file () для определения типа изображения?

Иногда изображения не имеют расширений, но остаются в силе. У меня есть форма для загрузки файлов и вам нужно определить тип файла, чтобы сравнить его с моим «белым списком».

Я знаю, что не могу доверять типу mime, отправленному из браузера, поэтому из проведенного мной исследования похоже, что это два доступных параметра (они работают только после загрузки файла):

$info = getimagesize($path); $imageType = $info['mime']; 

А также

 $finfo = finfo_open(FILEINFO_MIME_TYPE); $imageType = finfo_file($finfo, $path); 

Из теста, который я сделал, похоже, что оба они работают нормально, но мне интересно, есть ли какие-то причины использовать один из этих методов над другим?

Быстрый просмотр источника php показывает, что getimagesize() поддерживает следующие типы изображений:

 gif, jpeg, png, swf, psd, bmp, tiff, iff, jpc, jp2, jpx, jb2, xbm, ico 

finfo_file поддерживает много больше типов mime, например, duskwuff. С другой стороны, он также выполняет намного больше проверок, что делает его менее эффективным.

Небольшой мой тест:

 $startTime = microtime(true); for ($i=0; $i<50000; $i++) getimagesize("test.png"); echo microtime(true) - $startTime; $startTime = microtime(true); for ($i=0; $i<50000; $i++) { $finfo = finfo_open(FILEINFO_MIME_TYPE); $imageType = finfo_file($finfo, "test.png"); } echo '<br>'.(microtime(true) - $startTime); 

Результат:

 0.85886001586914 3.9046602249146 

getimagesize() работает только с файлами изображений, распознанными GD. Даже если у вас все включено, это все еще только изображения GIF, JPEG, PNG, BMP и XPM. finfo_file() предоставит вам типы MIME для более широкого разнообразия типов файлов, поэтому это гораздо лучший выбор, если вы ожидаете, что ваш код может использоваться для загрузки файлов, которые не являются изображениями.