файла - загрузка файлов на сервер php




php проверить расширение файла в форме загрузки (7)

Я проверяю расширение файла для загрузки или загрузки. мои методы были обработаны, но теперь мне нужно понять, мои методы (pathinfo) верны? еще лучше и быстрее? благодаря

$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if( $ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg' ) {echo 'error';}

pathinfo - это круто, но ваш код можно улучшить:

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

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


Для правильного достижения этого вам будет лучше, установив тип mime.

function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "shell_exec")) {
    // http://.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}
//pass the file name as
echo(get_mime($_FILES['file_name']['tmp_name']));

Как проверить расширение файла (только jpg / jpeg) в форме перед загрузкой. Вариант на другой опубликованный ответ здесь с включенным фильтром данных, который может быть полезен при оценке других опубликованных значений формы. Примечание: ошибка остается пустой, если она пуста, поскольку это была опция для моих пользователей, а не требование.

<?php
if(isset($_POST['save'])) {

//Validate image
if (empty($_POST["image"])) {
$imageError = "";
} else {
$image = test_input($_POST["image"]);
$allowed =  array('jpeg','jpg');
$ext = pathinfo($image, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
$imageError = "jpeg only";
}
}

}

// Validate data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
<?

Ваш html будет выглядеть примерно так:

<html>
<head>
</head>

<body>
<!-- Validate -->
<?php include_once ('validate.php'); ?>

<!-- Form -->
<form method="post" action="">

<!-- Image -->
<p>Image <?php echo $imageError; ?></p>
<input type="file" name="image" value="<?php echo $image; ?>" />

<p><input type="submit" name="save" value="SAVE" /></p>
</form>

</body>
</html>

Лично я предпочитаю использовать preg_match() :

if(preg_match("/\.(gif|png|jpg)$/", $filename))

или in_array()

$exts = array('gif', 'png', 'jpg'); 
if(in_array(end(explode('.', $filename)), $exts)

С помощью in_array() может быть полезно, если у вас есть много расширений для проверки и выполнения вопроса. Другой способ проверки изображений в файлах: вы можете использовать @imagecreatefrom*() , если функция не работает, это означает, что изображение недействительно.

Например:

function testimage($path)
{
   if(!preg_match("/\.(png|jpg|gif)$/",$path,$ext)) return 0;
   $ret = null;
   switch($ext)
   {
       case 'png': $ret = @imagecreatefrompng($path); break;
       case 'jpeg': $ret = @imagecreatefromjpeg($path); break;
       // ...
       default: $ret = 0;
   }

   return $ret;
}

тогда:

$valid = testimage('foo.png');

Предполагая, что foo.png является foo.png PHP-скрипта с расширением .png , эта функция перестает работать. Это может предотвратить атаки, такие как обновление оболочки и LFI .


Проверка расширения файла не считается лучшей практикой, предпочтительным методом выполнения этой задачи является проверка типа файлов mime .

От PHP:

<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type
foreach (glob("*") as $filename) {
    echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
?>

В приведенном выше примере будет выведено нечто похожее, которое вы должны проверить.

text/html
image/gif
application/vnd.ms-excel

Хотя mime-типы также могут быть обмануты (отредактируйте первые несколько байтов файла и измените магические числа), но это сложнее, чем редактирование имени файла. Таким образом, вы никогда не сможете быть на 100% уверены в том, что такое тип файла на самом деле, и следует позаботиться о том, чтобы обрабатывать файлы, загруженные / отправленные по электронной почте вашими пользователями.


использовать эту функцию

 function check_image_extension($image){

        $images_extentions = array("jpg","JPG","jpeg","JPEG","png","PNG");

        $image_parts = explode(".",$image);

        $image_end_part = end($image_parts);

        if(in_array($image_end_part,$images_extentions ) == true){

            return time() . "." . $image_end_part;


        }else{

            return false;
        }


    }

я думаю, это может сработать для вас

//<?php
    //checks file extension for images only
    $allowed =  array('gif','png' ,'jpg');
    $file = $_FILES['file']['name'];
    $ext = pathinfo($file, PATHINFO_EXTENSION);
        if(!in_array($ext,$allowed) ) 
            { 
//?>
<script>
       alert('file extension not allowed');
       window.location.href='some_link.php?file_type_not_allowed_error';
</script>

//<?php
exit(0);
    }
//?>




file-upload