Иногда изображения не имеют расширений, но остаются в силе. У меня есть форма для загрузки файлов и вам нужно определить тип файла, чтобы сравнить его с моим «белым списком».
Я знаю, что не могу доверять типу 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 для более широкого разнообразия типов файлов, поэтому это гораздо лучший выбор, если вы ожидаете, что ваш код может использоваться для загрузки файлов, которые не являются изображениями.