Возможный дубликат:
Как я могу разрешить определенные типы файлов при загрузке в php?
Как я могу сделать скрипт ниже только для изображений .jpg или .png? Он загружает каталог изображений в таблицу mysql на основе совпадения имени пользователя сеанса. Можно ли ограничить типы файлов? Потому что мне нужно только .jpg или .png
if ($_POST['submit']) { //get file attributes $Name = $_FILES['myfile']['name']; $tmp_name = $_FILES['myfile']['tmp_name']; error_reporting(E_ERROR | E_PARSE); if ($Name) { $location = "avatars/$Name"; move_uploaded_file($tmp_name, $location ) or die('Failed to upload picture'); $query = mysql_query("UPDATE fgusers3 SET imagelocation='$location' WHERE name='$name'") or die("Your profile image has been uploaded!"); }} echo "Upload your image below: <form action='profilepic.php' method='POST' enctype='multipart/form-data'> Profile Picture: <input type='file' name='myfile'> <input type='submit' name='submit' value='upload'> </form>";
if($_FILES){ $allowedExtensions = array("jpg","png"); foreach($_FILES as $key=>$val){ if(!empty($val['tmp_name'])){ $ext = end(explode(".",strtolower(basename($val['name'])))); if(in_array($ext,$allowedExtensions)){ $file = 'PATH_TO_UPLOAD'.basename($val['name']); if(move_uploaded_file($val['tmp_name'],$file)){ //SUCCESS_MESSAGE } }else{ //FAIL_MESSAGE } } } }
Вы можете использовать exif_imagetype($tmp_name)
чтобы проверить фактический тип файла на основе его заголовка. Это проверяет тип на основе содержимого файла, поэтому он является самым надежным (например, он даст вам правильную информацию, даже если кто-то дает вам JPG с расширением «.png»).
Существует также свойство type
( $_FILES['myfile']['type']
), которое даст вам тип MIME, который браузер утверждает, что файл есть. Однако этому нельзя доверять, если кто-то злонамеренно подделывает запрос.
Вы можете попробовать использовать pathinfo
& exif_imagetype
if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG) { // throw error }
Подробнее об обнаружении поддельных изображений
$ imageType = getimagesize ($ tmp_name); switch ($ imageType ['mime']! = "image / jpg" OR $ imageType ['mim']! = "image / png") {// код ошибки здесь. }
Это немного безопаснее, чем проверка расширения, поскольку расширение можно легко изменить. Тип мим также может быть изменен, но требует больше знаний xD
Конечно, вы можете ограничить расширение файла, но это небезопасно. Вы можете попробовать переименовать gif-файл и загрузить его. Немного безопаснее использовать mime-type для определения типа файла (но все же нет гарантии). Посмотрите: Как найти mime-тип файла с php?
Я думаю, что более безопасный пытается получить размер изображения или если преобразование в другой тип изображения будет успешным.
$whitelist = array(".jpg",".png"); foreach ($whitelist as $item) { if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) { $uploaddir='uploads/uploads_image/'; // or code } }