Traductor

Limitar el Tamaño de los Archivos Enviados al Servidor

En el capitulo anterior vimos como especificar el formato o extensión deseadas para los archivos que el usuario pueda subir al servidor.
Ahora veremos como limitar el tamaño de los archivos enviados al servidor, en capítulos anteriores habíamos visto como hacer esto desde HTML con un campo oculto, sin embargo esta forma no es segura, ahora veremos como hacerlo con PHP, del lado del servidor, por lo tanto una forma mas segura. 
if ($_FILES["fichero"]["size"] > 200000) {
die ("El fichero es demasiado grande.");
}
Como ve, esta vez hacemos uso de la propiedad size del archivo transmitido. Si el valor de esta operación excede el límite, la ejecución se interrumpe.


Otra operación que podemos hacer, es una comprobación relativa a que se produzca algún error general durante la transferencia del archivo, así:

if ($_FILES["fichero"]["error"] != 0) {
die ("Se ha producido un error.");
}
De esta manera, si ocurre algún error, que haya impedido grabar el archivo en el servidor, esta permite informarnos de ello.
La función move_uploaded_file() devuelve un valor true si ha podido grabar el archivo adecuadamente en el servidor, y un valor falso si no se ha podido grabar. Teniendo esto en mente podemos comprobar la operación de la siguiente manera.
$archivoRecibido=$_FILES["fichero"]["tmp_name"];
$destino="ficherosSubidos/fotoDelUsuario.jpg";
if (move_uploaded_file ($archivoRecibido, $destino)) {
echo ("Fichero grabado");
} else {
echo ("El fichero no se ha podido grabar.");
}
Pues con todo lo que hemos visto al momento, podemos crear un script bastante mas eficiente que el anterior.
<?php
// Se comprueba si el archivo tiene el formato adecuado.
                if ($_FILES["fichero"]["type"]!="image/jpeg") {
                               die ("El fichero no tiene el formato adecuado.");
                }

// Se comprueba que tenga un peso adecuado.
                if ($_FILES["fichero"]["size"] > 200000) {
                               die ("El fichero es demasiado grande.");
                }

// Se comprueba que no se hayan producido errores.
                if ($_FILES["fichero"]["error"] != 0) {
                               die ("Se ha producido un error.");
                }

// Por último, se intenta grabar y se comprueba si se graba bien.
                $archivoRecibido=$_FILES["fichero"]["tmp_name"];
                $destino="ficherosSubidos/fotoDelUsuario.jpg";
                if (move_uploaded_file ($archivoRecibido, $destino)) {
                               echo ("Fichero grabado");
                } else {
                               echo ("El fichero no se ha podido grabar.");
                }
?>
Sin embrago, aun es mejorable e código.
Ya sabemos que podemos incluir etiquetas HTML en nuestros scripts PHP, y otra que también podemos insertar, es código JavaScript. Así pues, podemos hacer que el script regrese a la página del formulario si hay algún error, de modo muy sencillo.
Observe el siguiente script:
<?php
                $error=false;
// Se comprueba si el archivo tiene el formato adecuado.
                if ($_FILES["fichero"]["type"]!="image/jpeg") {
                               $error=true;
                }

// Se comprueba que tenga un peso adecuado.
                if ($_FILES["fichero"]["size"] > 200000) {
                               $error=true;
                }

// Se comprueba que no se hayan producido errores.
                if ($_FILES["fichero"]["error"] != 0) {
                               $error=true;
                }

// Si se ha producido algún error se vuelve al formulario inicial.
                if ($error){
                                echo ("<script language='javascript' type='text/javascript'>");
                               echo ("location.href='comporbarYVolver.htm';");
                               echo ("</script>");
                }

// Por último, se intenta grabar y se comprueba si se graba bien.
                $archivoRecibido=$_FILES["fichero"]["tmp_name"];
                $destino="ficherosSubidos/fotoDelUsuario.jpg";
                if (move_uploaded_file ($archivoRecibido, $destino)) {
                               echo ("Fichero grabado");
                } else {
                               echo ("El fichero no se ha podido grabar.");
                }

?>

Paso a Paso

Observe lo que sucede en el código:
  • Comprobamos si la función type, size y error del fichero enviado, están dentro de los valores establecidos como válidos, si no es as, ponemos el valor true en una variable lógica que, inicialmente, se declara como falsa.
  • A continuación, comprobemos si se ha producido algún error (es decir, si la variable lógica empleada tiene el valor true).
  • Si es así, se ejecuta un código JavaScript (ver en la parte resaltada del código), que devuelve al usuario a la página donde se pide el fichero.
  • Para comprobar  el funcionamiento de este script cargue en su navegador el script.
Pensemos en otra forma de seguir mejorando nuestro script. Ya tenemos un código que hace todo lo que podemos necesitar. Pero ahora póngase en el papel del usuario. 
Si se le pide un fichero y, por error, selecciona uno inadecuado, el script hace que se le vuelva a pedir, sin darle ninguna indicación de lo que ha ocurrido. Es  fácil que el usuario piense que nuestro sitio funcione mal y lo abandone sin mas.
Para esto hay que informarle al usuario el error, para que envíe el formato adecuado. 
Veamos como funciona esto con el siguiente script.
<html>
      <head>
            <script language='javascript' type='text/javascript'>
                  function volver() {
                        location.href='volverPorFuncion.htm';
                  }
                  </script>
      </head>
      <body>
<?php
      $error=false;
// Se comprueba si el archivo tiene el formato adecuado.
      if ($_FILES["fichero"]["type"]!="image/jpeg") {
            echo ("El archivo no está en el formato adecuado.<br>");
                  $error=true;
      }

// Se comprueba que tenga un peso adecuado.
      if ($_FILES["fichero"]["size"] > 200000) {
            echo ("El archivo es demasiado grande.<br>");
                  $error=true;
      }

// Se comprueba que no se hayan producido errores.
      if ($_FILES["fichero"]["error"] != 0) {
            echo ("Hay un error en el archivo.<br>");
                  $error=true;
      }

// Si se ha producido algún error se vuelve al formulario inicial.
      if ($error){
            echo ("<input type='button' name='retorno' id='retorno' value='VOLVER' onClick='javascript:volver();';");
      } else {
// Por último, se intenta grabar y se comprueba si se graba bien.
            $archivoRecibido=$_FILES["fichero"]["tmp_name"];
            $destino="ficherosSubidos/fotoDelUsuario.jpg";
            if (move_uploaded_file ($archivoRecibido, $destino)) {
                  echo ("Fichero grabado");
            } else {
                  echo ("El fichero no se ha podido grabar.");
            }
      }
?>
      </body>
</html>
Lo que ha sucedido es:
  • En primer lugar, vea que tiene una función de JS destinada a devolverle a la página que contiene el formulario donde el usuario decide que fichero enviar.
  • Esta función de momento no se ejecuta.
  • Veamos el código PHP, que es lo que nos interesa. La parte donde se comprueba si lay algún error es igual que en el caso anterior, solo que mostrando, en cada circunstancia el tipo de error.
A continuación, se comprueba si la variable lógica que usamos como detector, de  haberse producido un error contiene el valor true. Si es así, se le muestra al usuario un botón que activa la función JS para volver a la página anterior.
Si la variable de error contiene el valor falso, no se muestra el botón. En su lugar, se almacena el archivo en la carpeta destinada a este fin en el servidor.

Como ve, con este código el usuario ya tiene una idea mas clara de lo que ha ocurrido cunado envía un archivo  y éste no es correcto.

Aparte de esto existen diferentes errores que se salen de nuestras manos, la linea, el módem el servidor etc. sin embargo hay que  ocuparnos en los errores que estén en nuestras manos.
Los cuales veremos en el siguiente capítulo.

Recuerden Comentar Compartir y Darle 

Hasta la Próxima

Si te hemos ayudado : )
Te agradeceríamos que apoyaras este proyecto

0 comentarios:

Publicar un comentario