Buscador


En todo Internet
En Uterra.Com

Contenidos


En este artículo ya vimos la forma básica de subir un archivo al servidor. En ese script no se controlaban aspectos tan importantes como el volumen del archivo o su tipo, con lo cual, tendríamos expuesto nuestro servidor a los virus.

Tras múltiples peticiones, he decidido publicar este nuevo código que nos permite controlar tanto el tamaño del archivo como su tipo.

El procedimiento es el ya descrito en el anterior artículo, solo agrega la verificación del tipo de archivo y la comprobación de su volumen.

Recordemos que el campo “nombre” asigna el nombre al archivo que se guardará en el servidor, aquí para simplificar, se lo asignamos mediante un campo “text”, en un caso real, el nombre se podría generar de diferentes formas, aleatoriamente o asignando un nombre proveniente de una base de datos.

También recordemos algo muy importante, guardamos los archivos en un directorio concreto, de lo contrario, estarían mezclados los archivos propios de la aplicación con los archivos de usuarios.

Un aspecto importante a destacar es el tipo de archivo, que no es lo mismo que la extensión del archivo. Por ejemplo, los archivos “.jpg” son del tipo “image/jpeg”, o los archivos “.zip” son del tipo “application/octet-stream”. Estos tipos pueden conocerse imprimiendo el valor de la variable “$tipo_archivo”. Para agregar una nueva extensión, bastará con ver el tipo en el mensaje de error, y agregarlo al script.

El volumen del archivo lo recoge la variable “$tamano_archivo” y viene expresado en bit. Un Kb son 1024 bit, y 1 Mb son 1024 Kb.

Sin más, el código es el siguiente: 

<html>    

<head>    
<title>Sube archivos al servidor.</title>    
</head>    

<body>    
<h3>Sube un archivo al servidor segun su tipo y volumen.</h3> 

<form action="subir.php" method="post" enctype="multipart/form-data">    

<p>Nombre <input type="text" name="elnombre" size="15"></p>    
<p>Foto      <input type="file" name="file01" size="15"></p>    

<p><input type="reset" value="Limpiar">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<input type="submit" value="Subir archivo"></p> 

</form>    
</body>    

</html>
---------------------------------------------
---------------------------------------------
--- subir.php

<?php
error_reporting
(-1);
ini_set("display_errors"1);

// Recibimos el archivo
  
$nombre_archivo $_FILES['file01']['name'];
$tipo_archivo $_FILES['file01']['type'];     
$tamano_archivo $_FILES['file01']['size'];
if (
move_uploaded_file($_FILES['file01']['tmp_name'], $nombre_archivo))
{
    
$vol_archi round($tamano_archivo 10242);    // Volumen archivo en Kb redondeado a dos decimales
    
$extension substr(strrchr($nombre_archivo"."), 1);    // Extraemos la extension del archivo

    
$volumen_min "5120";           // volumen minimo en bit - 5120 = 5 kb 
    
$volumen_max "5120000";       // volumen maximo en bit - 5120000 = 5 MB 
     
    
$archivo_permitido1 "image/jpeg";  // tipo 1 de archivo permitido   
    
$archivo_permitido2 "image/gif";       // tipo 2 de archivo permitido   
    
$archivo_permitido3 "application/octet-stream";       // tipo 3 de archivo permitido, .zip
    
$archivo_permitido4 "application/pdf";       // tipo 4 de archivo permitido, .pdf
     
    
if ($tamano_archivo >= $volumen_min AND $tamano_archivo <= $volumen_max AND    
    (
$tipo_archivo == $archivo_permitido1 OR $tipo_archivo == $archivo_permitido2 OR 
    
$tipo_archivo == $archivo_permitido3 OR $tipo_archivo == $archivo_permitido4))  
    {  
    
$new_nombre $_POST["elnombre"];     // Es el nuevo nombre del archivo
    
$carpeta "fotos";    // Carpeta en la que guardaremos nuestros archivos 
        
        // Renombramos el archivo
        
$archivo_renombrado "$new_nombre".$extension";   
        
rename($nombre_archivo$archivo_renombrado);
        
            if (
copy("$archivo_renombrado""$carpeta/$archivo_renombrado"))   
            {  
                echo 
"El fichero ha sido copiado con éxito. <br /> 
                    <a target=\"_blank\" href=\"
$carpeta/$archivo_renombrado\">$archivo_renombrado</a> <br />
                    
$vol_archi Kb";  
            } else {  
                echo 
"El fichero NO se ha podido copiar.";  
            } 
        
        
// Eliminamos el archivo del directorio raiz una vez copiado
        
unlink($archivo_renombrado);
    } else {
    echo 
"El archivo no es del tipo ($tipo_archivo) o volumen permitido ($vol_archi Kb)";

    
// Eliminamos el archivo del directorio raiz cuando no es un archivo permitido
    
unlink($nombre_archivo);
    }

} else {
    echo 
"Debe adjuntar algún archivo";
}
?>

Código PHP