Не удалось обнаружить тип mime. если я удалю ($mime=="image/jpeg" || $mime=="image/pjpeg")
, он может загрузить изображение успешно.
$mime = $_FILES['Filedata']['type']; if((!empty($_FILES['Filedata']['tmp_name'])) && ($_FILES['Filedata']['error'] == 0)) { $filename = basename($_FILES['Filedata']['name']); $ext = pathinfo($filename, PATHINFO_EXTENSION); if (($ext=="jpg" || $ext=="jpeg") && ($mime=="image/jpeg" || $mime=="image/pjpeg") && ($_FILES["Filedata"]["size"] < 350000)) { $newname = $filename; if (!file_exists($newname)) { if (move_uploaded_file($_FILES['Filedata']['tmp_name'], "./photo/" . $newname)) { echo "It's done! The file has been saved as: ".$newname; } else { echo "Error: A problem occurred during file upload!"; } } else {echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";} } else { echo "Error: Only .jpg images under 350Kb are accepted for upload"; } } else { echo "Error: No file uploaded"; }
Информация о name
и type
для загруженных файлов должна рассматриваться как чисто информационная и никогда не использоваться ни для чего серьезного , поскольку она предоставлена пользователем и может быть легко подделана. Вы должны только просматривать tmp_name
, error
и size
чтобы определить, хотите ли вы принять файл. Чтобы найти фактический тип файла MIME, используйте встроенные функции PHP:
if ($file['error'] == UPLOAD_ERR_NO_FILE) { die('No file uploaded'); } if ($file['error'] != UPLOAD_ERR_OK) { die('Error during upload'); } if (!$file['size'] || !is_uploaded_file($file['tmp_name'])) { die('File is weird'); } $extensions = array(IMAGETYPE_GIF => '.gif', IMAGETYPE_JPEG => '.jpg', IMAGETYPE_PNG => '.png'); $exifType = exif_imagetype($file['tmp_name']); if (!isset($extensions[$exifType])) { die('Unsupported file type'); } $ext = $extensions[$exifType]; $targetDir = '/somewhere/else/'; do { $target = $targetDir . uniqid() . $ext; } while (file_exists($target)); if (!move_uploaded_file($file['tmp_name'], $target)) { die('Something went wrong'); } echo 'Yay, uploaded!';
Не то чтобы вы обязательно должны использовать это множество die()
хотя это просто для демонстрационных целей.