tipo - php comprobar la extensión de archivo en forma de carga
validar extension de archivo php (10)
Compruebo la extensión del archivo para subirlo o no. mis métodos ie funcionaban, pero ahora necesito entender, ¿mis métodos (pathinfo) son verdaderos? otra forma mejor y más rápida ?! Gracias
$filename = $_FILES[''video_file''][''name''];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if( $ext !== ''gif'' || $ext !== ''png'' || $ext !== ''jpg'' ) {echo ''error'';}
Cómo validar la extensión de archivo (jpg / jpeg solamente) en un formulario antes de que se realice la carga. 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;
}
<?
Tu html se verá algo así;
<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>
Comprobar la extensión del archivo no se considera la mejor práctica, el método preferido para llevar a cabo esta tarea es verificar el tipo de archivo mime .
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 ejemplo anterior arrojará algo similar a lo que debería verificar.
text/html
image/gif
application/vnd.ms-excel
Aunque los mime-types también pueden engañarse (edite los primeros bytes de un archivo y modifique los números mágicos), pero es más difícil que 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.
Creo que esto podría funcionar para ti
//<?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);
}
//?>
No estoy seguro si esto tendría un tiempo de computación más rápido, pero otra opción ...
$acceptedFormats = array(''gif'', ''png'', ''jpg'');
if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) {
echo ''error'';
}
Para lograr esto de manera adecuada, será mejor que compruebe 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://.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'']));
Personalmente, prefiero usar la función preg_match() :
if(preg_match("//.(gif|png|jpg)$/", $filename))
$exts = array(''gif'', ''png'', ''jpg'');
if(in_array(end(explode(''.'', $filename)), $exts)
Con in_array()
puede ser útil si tiene muchas extensiones para validar y realizar una pregunta. Otra forma de validar imágenes de archivo: puede usar @imagecreatefrom*()
, si la función falla, esto 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;
}
entonces:
$valid = testimage(''foo.png'');
Asumiendo que foo.png
es un archivo PHP-script con extensión .png
, la función anterior falla. Puede evitar ataques como la actualización de shell y LFI .
Usar if( $ext !== ''gif''
) podría no ser eficiente, ¿qué tal si permites 20 extensiones diferentes?
Tratar
$allowed = array(''gif'',''png'' ,''jpg'');
$filename = $_FILES[''video_file''][''name''];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
echo ''error'';
}
el tipo de archivo también se puede verificar de otras maneras. 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 está tratando con un archivo de video, reemplace la verificación de imagen con un control de video en el bloque if ... diviértase
$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 */ }
pathinfo es genial, pero tu código puede mejorarse:
$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.
usa 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;
}
}