Лучший способ получить тип расширения файла фотографии в PHP

Я перестраиваю свой раздел для загрузки фотографий на своем сайте, я стараюсь как можно больше узнать, чтобы я мог сделать это надежно, но также и с лучшей производительностью. У моего сайта есть 15-20 фотографий, загружаемых в минуту обычно

Точно так же этот метод является надежным для получения типа файла фотографии, например, jpg, gif, png?

$fileType = $_FILES['image']['type']; 

Solutions Collecting From Web of "Лучший способ получить тип расширения файла фотографии в PHP"

Расширения файлов лежат или, по крайней мере, могут быть. Определенно лучше не полагаться на / доверенные пользовательские данные. Кроме того, как написано в руководстве PHP:

$ _FILES ['userfile'] ['type'] – тип mime файла, если браузер предоставил эту информацию. Примером может служить «image / gif». Этот тип mime, однако, не проверяется на стороне PHP и поэтому не принимает его значение как должное.

Это ненадежно.

Вот лучший способ:

getimagesize() PHP возвращает численный индексный массив данных об изображении, а индекс 2 является одной из констант IMAGETYPE_XXX ( полный список которых доступен здесь ), указывающий тип изображения. Затем они могут использоваться в ряде семейных функций GD, причем два соответствующих image_type_to_extension() и image_type_to_mime_type() .

Таким образом, вы можете легко что-то сделать в этом направлении:

 $imageData = getimagesize($_FILES['userfile']['tmp_name']); // $imageData[2] will contain the value of one of the constants $mimeType = image_type_to_mime_type($imageData[2]); $extension = image_type_to_extension($imageData[2]); 

Хотя, если у вас есть расширение exif , [exif_imagetype()][5] вернет тот же результат, что и индекс 2 getimagesize() но намного быстрее.

Я использовал методы GD в качестве основного примера, потому что они чаще встречаются в установках PHP. Но расширение Imagick также предлагает аналогичную функциональность, и вы также можете проверить тип mime с расширением fileinfo (включенным начиная с 5.3, btw).

exif_imagetype () – самый безопасный, самый быстрый и надежный способ проверить, является ли данный файл допустимым файлом изображения, он также работает с удаленными URL-адресами.

Возвращаемое значение – это то же значение, которое getimagesize () возвращает в индексе 2, но exif_imagetype () выполняется намного быстрее.

 $type = @exif_imagetype($_FILES['image']['tmp_name']); if (($type >= 1) && ($type <= 3)) { echo 'Valid image (GIF, JPG or PNG).'; } else { unlink($_FILES['image']['tmp_name']); // delete it } 

Сначала попробуйте getimagesize или exif_imagetype() ,

если он не возвращает ['mime'] , попробуйте finfo_file (если extension_loaded('fileinfo') ),

если все еще нет результатов, попробуйте mime_content_type (если function_exists('mime_content_type') ).

Если вы не хотите тип mime , а просто расширение файла , используйте pathinfo($path, PATHINFO_EXTENSION) .

Как говорит док ,

Тип mime файла, если браузер предоставил эту информацию . […] Этот тип mime, однако, не проверяется на стороне PHP и поэтому не принимает его значение как должное .

Другими словами, вы не должны доверять ему, потому что я мог бы загружать почти все, что захочу, и сделать его похожим на jpeg.

Чтобы убедиться, что загруженный файл на самом деле является изображением, я использовал персонализацию Imagick :: identImage в прошлом с отличными результатами. GD, вероятно, имеет такую ​​же функцию.

Или вы можете получить сторону сервера типа mime, используя расширение fileinfo , а точнее finfo_file ()