Я проверяю расширение файла для загрузки или загрузки. мои методы были обработаны, но теперь мне нужно понять, мои методы (pathinfo) верны? еще лучше и быстрее? благодаря
$filename = $_FILES['video_file']['name']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if( $ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg' ) {echo 'error';}
Использование if( $ext !== 'gif'
) может оказаться неэффективным, если вы разрешите использовать 20 разных расширений
Пытаться
$allowed = array('gif','png' ,'jpg'); $filename = $_FILES['video_file']['name']; $ext = pathinfo($filename, PATHINFO_EXTENSION); if(!in_array($ext,$allowed) ) { echo 'error'; }
Проверка расширения файла не считается лучшей практикой, предпочтительным методом выполнения этой задачи является проверка типа файлов 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% уверены в том, что такое тип файла на самом деле, и следует позаботиться о том, чтобы обрабатывать файлы, загруженные / отправленные по электронной почте вашими пользователями.
Лично я предпочитаю использовать функцию 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 .
pathinfo – это круто, но ваш код можно улучшить:
$filename = $_FILES['video_file']['name']; $ext = pathinfo($filename, PATHINFO_EXTENSION); $allowed = array('jpg','png','gif'); if( ! in_array( $ext, $allowed ) ) {echo 'error';}
Конечно, просто проверка расширения имени файла не гарантирует тип файла как допустимое изображение. Вы можете использовать функцию getimagesize
для проверки загруженных файлов изображений.
Не уверен, что это будет иметь более быстрое вычислительное время, но еще один вариант …
$acceptedFormats = array('gif', 'png', 'jpg'); if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) { echo 'error'; }
тип файла также можно проверить другими способами. Я считаю, что это самый простой способ проверить тип загруженного файла. Если u имеет дело с файлом изображения, тогда перейдите к следующему коду. если вы имеете дело с видео-файлом, то замените проверку изображения с помощью проверки видео в блоке if.
$ img_up = $ _FILES ['video_file'] ['type']; $ img_up_type = explode ("/", $ img_up); $ img_up_type_firstpart = $ img_up_type [0];
if ($ img_up_type_firstpart == "image") {// образ – это тип файла изображения, вы можете иметь дело с видео, если вам нужно проверить тип видеофайла
/ * сделать ваш логический код * /
}
я думаю, это может сработать для вас
//<?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); } //?>
Для правильного достижения этого вам будет лучше, установив тип 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://stackoverflow.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>
использовать эту функцию
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; } }