Подтвердить что ты не робот

Как проверить тип загруженного файла в 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"){...

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

4b9b3361

Ответ 1

Никогда не используйте $_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 великолепны, если ваш сервер поддерживает их.

Ответ 2

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

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

Ответ 3

Конечно, вы можете проверить, есть ли это изображение с 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 );

Ответ 4

Лучший способ, на мой взгляд, сначала использовать 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 docs нельзя полагаться на проверку содержимого типа изображения.

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

Ответ 5

В 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/

Ответ 6

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

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

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

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

Ответ 7

Последняя линия близка. Вы можете использовать: if (mime_content_type($_FILES['fupload']['tmp_name']) == "image/gif"){...

В случае, когда я сейчас работаю, мой $_FILES..['type'] сообщает себя как "text/csv", в то время как mime_content_type() и finfo() (предлагаемые другими) сообщают "text/plain"., Как отмечает @deceze, $_FILES..['type'] полезно только знать, какой тип клиент считает файлом.

Ответ 8

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

РЕДАКТИРОВАТЬ: не используйте этот метод, поскольку он не выполняет проверку безопасности. Я оставляю этот ответ здесь, чтобы никто не делал такую ​​же ошибку, как я, пытаясь это сделать.


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

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

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