2012-05-04 13 views
33

Reviso la extensión del archivo para cargar o no cargar. mis métodos i.e funcionaron, pero ahora tengo que entender, mis métodos (pathinfo) es cierto? otra forma mejor y más rápida ?! Graciasphp check file extension en el formulario de carga

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

¿Por qué el llamado 'video_file' presentado todavía estás permitiendo sólo las imágenes .. – cream

+2

me encontré con esta pregunta en busca de extensiones de archivo válidos. No estoy respondiendo la pregunta aquí, pero me gustaría indicar que tiene un error de lógica en su declaración if. Debe ser '&&' entre las condiciones y no '||' ... Solo pensé en compartir mi punto de vista. – itsols

Respuesta

94

Usando if($ext !== 'gif') podría no ser eficiente lo que si se permite como 20 diferentes extensiones

Trate

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

Estaba cargando un nombre de archivo con mayúsculas (DOG.JPG), así que tuve que agregar $ filename = strtolower ($ filename); – Mikeys4u

+0

@ Baba Hola señor, ¿cómo podemos hacer esto en la carga de múltiples archivos? y también recibo el error en $ ext, significa que no puedo obtener mi extensión de archivo de este código. ¿que debería hacer? –

37

extensión de archivo Comprobación no se considera la mejor práctica, el método preferido de llevar a cabo esta tarea es mediante la comprobación de los archivos mime type.

Desde PHP:

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

El resultado del ejemplo sería algo similar a la que se debe comprobar.

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

Aunque los tipos MIME también pueden ser engañados (editar los primeros bytes de un archivo y modificar los números mágicos) pero es más difícil de editar un nombre de archivo. Por lo tanto, nunca puede estar 100% seguro de cuál es realmente ese tipo de archivo, y se debe tener cuidado con el manejo de archivos cargados/enviados por correo electrónico por sus usuarios.

+2

Casi dudo que haya una manera de obtener la extensión de archivo REAL. En todas partes hay respuestas "para analizar el nombre de archivo", que es la peor manera ... ¡Muchas gracias por esta respuesta! – instead

+1

Esta respuesta debería estar en la parte superior, ¡es muy fácil para alguien cambiar la extensión de un archivo! –

+0

¿Qué sugieres si el MIME es falso? Un usuario malintencionado puede cargar archivos fácilmente mediante un script o alguna otra aplicación automatizada que permita el envío de solicitudes HTTP POST, lo que le permite enviar un tipo de mime falso. –

10

Personalmente, yo prefiero usar preg_match() función:

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

o in_array()

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

Con in_array() puede ser útil si usted tiene una gran cantidad de extensiones para validar y pregunta del perfomance. Otra forma de validar imágenes de archivo: puede usar @imagecreatefrom*(); si la función falla, significa que la imagen no es válida.

Por ejemplo:

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; 
} 

a continuación:

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

Suponiendo que foo.png es un archivo de script PHP con .png extensión, la función anterior falla. Puede evitar ataques como la actualización de shell y LFI.

5

pathinfo es fresco, pero su código se puede mejorar:

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

Por supuesto simplemente verificar la extensión del nombre de archivo no garantizaría el tipo de archivo como una imagen válida. Puede considerar el uso de una función como getimagesize para validar los archivos de imagen cargados.

2

No estoy seguro si esto tendría un tiempo más rápido de cálculo, pero otra opción ...

$acceptedFormats = array('gif', 'png', 'jpg'); 

if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) { 
    echo 'error'; 
} 
2

tipo de archivo se puede comprobar en otras maneras también. Creo que esta es la forma más fácil de verificar el tipo de archivo cargado. Si se trata de un archivo de imagen, busque el siguiente código.si se trata de un archivo de vídeo a continuación, reemplazar el cheque imagen con un cheque de vídeo en el bloque if .. divertirse uso

 
    $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") { // image is the image file type, you can deal with video if you need to check video file type

/* do your logical code */ }

+0

$ _FILES ['field_name'] ['type'] es un usuario definido y, por lo tanto, no se debe confiar para su validación. Debe usar la función exif_imagetype o getimagesize de php para verificar los detalles/tipo de su imagen. – dading84

-2

esta función

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; 
     } 


    } 
1

creo que esto podría funcionar para usted

//<?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); 
    } 
//?> 
0

Para lograr esto, lo mejor sería comprobar el tipo de mimo.

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'])); 
0

Cómo validar la extensión de archivo (jpg/jpeg solamente) en un formulario antes de cargarlo. Una variación de otra respuesta publicada aquí con un filtro de datos incluido que puede ser útil al evaluar otros valores de formularios publicados. Nota: el error se deja en blanco si está vacío ya que esta era una opción para mis usuarios, no es un requisito.

<?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; 
} 
<? 

Su html se verá algo como esto;

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