Я перестраиваю свой раздел для загрузки фотографий на своем сайте, я стараюсь как можно больше узнать, чтобы я мог сделать это надежно, но также и с лучшей производительностью. У моего сайта есть 15-20 фотографий, загружаемых в минуту обычно
Точно так же этот метод является надежным для получения типа файла фотографии, например, jpg, gif, png?
$fileType = $_FILES['image']['type'];
Расширения файлов лежат или, по крайней мере, могут быть. Определенно лучше не полагаться на / доверенные пользовательские данные. Кроме того, как написано в руководстве 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 ()