Как проверить тип загруженного файла в PHP

Я использовал этот код для проверки типа изображений,

$f_type=$_FILES['fupload']['type']; if ($f_type== "image/gif" OR $f_type== "image/png" OR $f_type== "image/jpeg" OR $f_type== "image/JPEG" OR $f_type== "image/PNG" OR $f_type== "image/GIF") { $error=False; } else { $error=True; } 

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

Мне было интересно, исправляет ли это проблему:

if (mime_content_type($_FILES['fupload']['type']) == "image/gif"){...

Любые комментарии?

Никогда не используйте $_FILES..['type'] . Информация, содержащаяся в нем, не проверена вообще, это определяемое пользователем значение. Проверьте тип самостоятельно. Для изображений exif_imagetype обычно является хорошим выбором:

 $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF); $detectedType = exif_imagetype($_FILES['fupload']['tmp_name']); $error = !in_array($detectedType, $allowedTypes); 

Кроме того, функции finfo великолепны, если ваш сервер поддерживает их.

В дополнение к @deceze вы также можете finfo () проверить MIME-тип файлов без изображения:

 $finfo = new finfo(); $fileMimeType = $finfo->file($path . $filename, FILEINFO_MIME_TYPE); 

На мой взгляд, лучше всего использовать getimagesize (), за которым следует imagecreatefromstring () .

  $size = getimagesize($filename); if ($size === false) { throw new Exception("{$filename}: Invalid image."); } if ($size[0] > 2500 || $size[1] > 2500) { throw new Exception("{$filename}: Image too large."); } if (!$img = @imagecreatefromstring(file_get_contents($filename))) { throw new Exception("{$filename}: Invalid image content."); } 

Проверка методом getimagesize() предотвращает некоторые DoS-атаки, потому что нам не нужно пытаться создавать imagecreatefromstring() из каждого файла, предоставленного пользователем, либо файл изображения, либо файл слишком большой. К сожалению, в соответствии с PHP документами нельзя полагаться на проверку содержимого типа изображения.

imagecreatefromstring() наконец, пытается открыть файл как изображение – если это удается – у нас есть изображение.

В PHP 5.5 я использую эту функцию для получения типа файла и проверяю, есть ли изображение:

 function getFileType( $file ) { return image_type_to_mime_type( exif_imagetype( $file ) ); } // Get file type $file_type = getFileType( 'path/to/images/test.png' ); echo $file_type; // Prints image/png // 1. All images have mime type starting with "image" // 2. No other non-image mime types contain string "image" in it 

Тогда вы могли бы сделать:

 if ( strpos( $filetype, 'image' ) !== false ) { // This is an image } 

Полный список типов mime: http://www.sitepoint.com/web-foundations/mime-types-complete-list/

Конечно, вы можете проверить, есть ли это изображение с exif, но лучший способ, я думаю, это сделать с finfo следующим образом:

 $allowed_types = array ( 'application/pdf', 'image/jpeg', 'image/png' ); $fileInfo = finfo_open(FILEINFO_MIME_TYPE); $detected_type = finfo_file( $fileInfo, $_FILES['datei']['tmp_name'] ); if ( !in_array($detected_type, $allowed_types) ) { die ( 'Please upload a pdf or an image ' ); } finfo_close( $fileInfo ); 

Это простой сценарий с одной строкой, который я часто использую.

 $image = "/var/www/Core/temp/image.jpg"; $isImage = explode("/", mime_content_type())[0] == "image"; 

В основном я использую mime_content_type (), чтобы получить что-то вроде «image / jpg», а затем взломать его «/» и проверить на первый элемент массива, чтобы увидеть, говорит ли он «образ».

Надеюсь это работает!

ПРЕДУПРЕЖДЕНИЕ : следующий ответ фактически не проверяет тип файла. Он проверяет только имя. Он не подходит для реальных целей безопасности.

EDIT: не используйте этот метод, поскольку он не выполняет проверку безопасности. Я оставляю этот ответ здесь, чтобы никто не делал такую ​​же ошибку, как я, пытаясь это сделать.


Я попробовал следующее, и это сработало для меня:

 $allowed = array('gif','png' ,'jpg', 'pdf'); $filename = $_FILES['input_tag_name']['name']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!in_array($ext,$allowed) ) { echo 'error'; } 

Ссылка источника