Php проверить расширение файла в форме загрузки
Я проверяю расширение файла для загрузки или загрузки. мои i.e методы работали, но теперь мне нужно понять, мои методы (pathinfo) верны? еще лучше и быстрее? Благодаря
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if( $ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg' ) {echo 'error';}
Ответы
Ответ 1
Использование 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';
}
Ответ 2
Проверка расширения файла не считается лучшей практикой, предпочтительным методом выполнения этой задачи является проверка файлов тип 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% уверены в том, что такое тип файла на самом деле, и следует проявлять осторожность при обработке файлов, загруженных/отправленных по электронной почте вашими пользователями.
Ответ 3
Лично я предпочитаю использовать функцию 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
является файлом PHP-script с расширением .png
, эта функция перестает работать. Это может предотвратить атаки, такие как обновление оболочки, и LFI.
Ответ 4
pathinfo - это круто, но ваш код можно улучшить:
$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
$allowed = array('jpg','png','gif');
if( ! in_array( $ext, $allowed ) ) {echo 'error';}
Конечно, просто проверка расширения имени файла не гарантирует тип файла как допустимое изображение. Вы можете использовать функцию типа getimagesize
для проверки загруженных файлов изображений.
Ответ 5
Не уверен, что это будет иметь более быстрое вычислительное время, но еще один вариант...
$acceptedFormats = array('gif', 'png', 'jpg');
if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) {
echo 'error';
}
Ответ 6
тип файла также можно проверить другими способами. Я считаю, что это самый простой способ проверить тип загруженного файла. Если 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" ) {//образ - это тип файла изображения, вы можете иметь дело с видео, если вам нужно проверить тип видеофайла
/* сделать свой логический код */
}
Ответ 7
Я думаю, это может сработать для вас
//<?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);
}
//?>
Ответ 8
Для правильного достижения этого вам будет лучше, установив тип 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']));
Ответ 9
Как проверить расширение файла (только 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>
Ответ 10
используйте эту функцию
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;
}
}