Вы можете использовать различные инструменты:
FileInfo
Вы можете использовать FileInfo непосредственно из PHP:
$finfo = finfo_open(FILEINFO_MIME_TYPE);
echo finfo_file($finfo, 'the_file_to_check.ico');
// Should print something like 'image/x-icon'
finfo_close($finfo);
Если в вашей системе установлено FileInfo, это, вероятно, самый простой способ.
ImageMagick
ImageMagick идет на шаг дальше, на самом деле декодирование содержимого файла, в котором перечислены встроенные изображения:
$ identify favicon.ico
favicon.ico[0] ICO 16x16 16x16+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000
favicon.ico[1] ICO 32x32 32x32+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000
favicon.ico[2] ICO 48x48 48x48+0+0 32-bit sRGB 15.1KB 0.000u 0:00.000
(вызывается из командной строки в этом примере)
Я не знаю, как FileInfo работает с ICO-файлами, но ImageMagick, вероятно, безопаснее, поскольку он действительно должен декодировать значительную часть файла.
Поскольку ImageMagick поддерживает множество форматов, важно проверить его вывод, а не просто его код возврата (ему также удается использовать JPG, SVG и т. Д.).
IcoUtils
Как легкая альтернатива ImageMagick, IcoUtils может сделать трюк:
$ icotool -l favicon.ico
--icon --index=1 --width=16 --height=16 --bit-depth=32 --palette-size=0
--icon --index=2 --width=32 --height=32 --bit-depth=32 --palette-size=0
--icon --index=3 --width=48 --height=48 --bit-depth=32 --palette-size=0
$ icotool -l not_a_favicon.svg
favicon.svg: not an icon or cursor file (reserved non-zero)
К сожалению, его код возврата всегда 0, заставляя вас на самом деле проверить свою продукцию.
Он может быть установлен на Ubuntu с:
sudo apt-get install icoutils
Используйте 'Fileinfo', чтобы получить тип mime, а затем сравните его с вашим желаемым типом mime. http://php.net/Fileinfo –
Спасибо за ваш комментарий. И безопасный способ проверить это? Я хочу быть уверенным, что пользователь не вмешивается. Если это так, вы можете оставить мне свой комментарий в качестве ответа, и я пометю его как правильный ответ. @CharlotteDunois –
'Функции в этом модуле пытаются угадать тип содержимого и кодировку файла, ища определенные последовательности байтов в определенных положениях в пределах файл. Хотя это не пуленепробиваемый подход, используемые эвристики выполняют очень хорошую работу. «Это намного лучше, чем полагаться на' $ _FILES [...] ['mime'] ' –