Módulo G: CARGA Y MOSTRAR ARCHIVO E IMAGENES Objetivo del Módulo: Contribuir con la administración de archivos de usuario en servidor En muchas ocasiones es necesario que en nuestros aplicativos se permita adjuntar archivos en diversos formatos (imagen, pdf, documento de texto, etc.) para ser administrados y presentados en nuestro programa. Existen muchas formas de almacenar y procesar este tipo de información en el lenguaje de programación PHP, una de ellas es guardar el archivo en base de datos; pero en criterio de muchos miembros de la comunidad del desarrollo web es que esta es una forma no muy eficiente, ya que obtendremos una base de datos pesada y con ello un aplicativo más lento. Por este motivo en este módulo presentaremos una alternativa en la cual guardaremos y gestionaremos estos archivos en una carpeta del aplicativo y en un campo de base de datos solo guardaremos la ruta donde se guardó el archivo dentro de nuestro aplicativo para posteriormente buscar , mostrar o descargar el archivo en base a esa ruta Ejemplo: Ahora bien para el trabajo de codificación tomaremos un ejemplo de un programa en cual una Navegador persona puede registrar sus datos personales y adjuntar la fotocopia de identificación y podrá realizarlo en formato pdf o imagen (Nota: Es recomendable en caso de permitir adjuntar documentación, esta se realice en formato pdf) Base de datos a utilizar… En una carpeta “subirhst” tendremos un archivo index.php en el cual visualizaremos la siguiente interfaz Al realizar clic en el enlace de “Nuevo” pasaremos a visualizar el siguiente formulario el cual tiene adicionales a dos cajas de texto para la identificación y el nombre, un „input‟ de tipo “file” el cual permitirá al usuario subir su archivo al aplicativo Archivo fsubir.html Antes de continuar a explicar el código del anterior formulario fsubir.html debemos aclarar algunos conceptos <input onchange="ValidarArchivo(this,3000000,'jpg|pdf|txt');" id="documento" name="documento[]" type="file" multiple="multiple" /> Es importante mencionar que si dejamos el atributo multiple="multiple" nos permitirá seleccionar y subir más de un archivo, en caso que solo deseemos admitir subir un solo archivo debemos quitarlo. Con el fin de optimizar el proceso de subida de uno o varios archivos, al nombre del input deberemos añadir corchetes al finalizar el nombre del campo name="documento[]" Para validar el ingreso de archivos con formato o tamaño no permitido, emplearemos en el evento onchange una función de JavaScript previamente preparada la cual encontraremos en el archivo funciones,js contenido en la carpeta “js” con los siguientes parámetros. ValidarArchivo (this,tamaño máximo en bytes,’formatopermitido1 | formatopermitido 2’) Archivo fsubir.html <meta charset="utf-8"/><!-- determinamos el tipo de codificación a emplear --> <script type="text/javascript" src="js/funciones.js"></script><!-llamamos al archivo de funciones para validar el archivo en front-end --> <form align="center" action="subir.php" method="POST" ENCTYPE="multipart/form-data"><!-- creamos nuestro formulario y establecemos la ruta donde se va a procesar nuestro archivo y añadir ENCTYPE="multipart/form-data" que permite enviar archivos file --> <p> <label for="textfield">Identificación Usuario </label><!--etiqueta informativa de Identificación Usuario --> <input align="center" type="text" name="id" id="textfield" required /><!--caja de texto para la identificación de usuario --> </p> <p> <label for="textfield">Nombre Usuario </label><!--etiqueta informativa de Nombre Usuario --> <input align="center" type="text" name="nombre_usu" id="textfield" required /><!--caja de texto para la nombre de usuario --> </p> <p> <label for="textfield">Fotocopia de identificación:</label><!-etiqueta informativa de Fotocopia de identificación --> <input onchange="ValidarArchivo(this,3000000,'jpg|pdf|txt');" id="documento" name="documento[]" type="file" multiple="multiple" /><!-input que permite seleccinar archvivos para ser subidos --> </p> <p> <input type="submit" name="submit" id="submit" value="Guardar" ><!-input para enviar el formulario con sus respectivos datos --> </p> </form> Gracias a las funciones de ValidarArchivo de Js validar con el siguiente aviso cualquier archivo que no corresponda En caso de ingresar los datos correctamente, nuestro proceso pasará al archivo subir.php el cual recibirá el o los archivos y con el fin de garantizar en el back-end la seguridad validaremos el formato y el tamaño máximo de un archivo nuevamente y guardaremos la información correspondientes en base de datos como lo observaremos en el siguiente código. Archivo subir.php <?php $tamaño_maximo=15000000; //Determinamos el tamaño maximo en bytes permitido del archivo $formatos = array("jpg", "pdf", "txt");//Determinamos los formatos permitidos $total = count($_FILES['documento']['name']);// Contamos la cantidad de archivos for($i=0; $i<$total; $i++) {// Recorremos cada archivo $nombre_archivo=$_FILES['documento']['name'][$i]; //obtenemos el nombre de cada uno de los archivos mediante el tipo de variable $_FILES['nombre_campo_file']['name']['posición'] $ruta_tmp_archivo = $_FILES['documento']['tmp_name'][$i];//Cuando subimos uno o varios archivos se guardan en una ruta temporal la cual Obtendremos la ruta de archivo temporal if ($ruta_tmp_archivo != ""){ //Nos aseguramos que tengamos una ruta de archivo no sea vacia $extensión_archivo = (pathinfo($nombre_archivo,PATHINFO_EXTENSION)); //obtenemos la extensión del archivo mediante la función PATHINFO_EXTENSION if (!in_array($extensión_archivo, $formatos)){echo "El formato no es valido"; } //Validamos que el archivo cuente con la extensión permitida if(filesize($_FILES['documento']['tmp_name'][$i]) > $tamaño_maximo ) {//Validamos que el archivo no cuente un tamaño superior al especificado echo "No se puede subir archivos con tamaño mayor a ".$tamaño_maximo; //Mensaje de advertencia exit(); //Sale del ciclo por no cumplir las condiciones } $ruta_destino = "documento/".$_FILES['documento']['name'][$i]; //Configuración y guardamos en una variable la ruta donde se guardará el archivo "Carpeta_donde_se_guarda_/NombreParaGuardar" if(move_uploaded_file($ruta_tmp_archivo,$ruta_destino)) { //Movemos el archivo de la ruta temporal a la ruta anterior donde deseamos guardar el archivo require 'conexion.php'; //Llamamos el archivo de conexion $sql='insert into persona (identificacion,nombre,fotocopia_id) VALUES("'.$_POST['id'].'","'.$_POST['nombre_usu'].'","'.$ruta_destino.'") ';//Insertamos la información que ingresó el usuario dentificación,Nombre,ruta donde se guardo el archivo,ya que luego la necesitaremos para mostrar o descargar el archivo $insertar=$mysqli->query($sql); ?><!-- Enviamos la consulta de base de datos annterior a base de datos --> <script type="text/javascript"> //Abrimos un nuevo script alert('Archivos subidos con exito'); //Notificamos a nuestro usuario sobre el exito del proceso window.location = 'index.php'; //Redireccionamos para que el usuario pueda ver la información o donde gustemos </script> <!--Cerramos el script --> <?php } //Cerramos el if de la lina 16 }//Cerramos el if de la lina 10 }//Cerramos el for de la lina 6 Después de haber haber procesado e ingresado la información nos redirige a nuestro archivo index.php mencionado al inicial de la guía en el cual utilizaremos una consulta de base de datos para presentar la información correspondiente Archivo index.php Archivo index.php <meta charset="utf-8"/>;<!—determinamos la codificación --> <?php require 'conexion.php';//Llamamos al archivo de conexion $sql = 'select * from persona'; //Realizamos una consulta de la información de la tabla persona $consulta = $mysqli ->query ($sql); ?> <!-- Enviamos esta información a la base de datos--> <table border="2"> <!-- creamos una tabla con borde --> <tr><!-- creamos una fila --> <td colspan="4" align="center">Persona</td><!-- creamos una columna Persona --> <td colspan="2" align ="center"><a href="fsubir.html">Nuevo</a></td> <!-Creamos una columna y un enlace el cual nos dirige al archivo fsubir.html --> </tr><!-- cerramos una fila --> <tr><!-- creamos una fila --> <td>Identificación</td><!-- creamos una columna para Identificación --> <td>Nombre</td><!-- creamos una columna para Nombre --> <td>Vista Previa del documento</td><!-- creamos una columna Vista Previa del documento --> <td>Descargar documento</td><!-- creamos una columna para Descargar documento --> <td>Imagen</td><!-- creamos una columna para Imagen --> <td>Eliminar</td><!-- creamos una columna para Eliminar --> </tr><!-- cerramos una fila --> <?php while ($row= $consulta ->fetch_Assoc()) { ?> <!--Mientras existan registros se guardarán en el array $row --> <tr><!-- creamos una fila --> <td> <?php echo $row['identificacion']; ?> </td><!-- creamos una columna para mostrar Identificación --> <td> <?php echo $row['nombre']; ?> </td><!-- creamos una columna para mostrar Nombre --> <td> <a target="_blank" href="<?php echo $row['fotocopia_id'] ; ?>"><?php echo "Vista Previa" ; ?> </a> </td><!-- Si deseamos visualizar en una nueva ventana el archivo basta con crear un enlace con la ruta almacenada en base de datos se sugiere en imagenes y pdf --> <td> <a href="funciones/funciones.php?documento=<?php echo $row['fotocopia_id'] ; ?>"><?php echo "Descargar" ; ?></a> </td><!-Si deseamos descargar el archivo enviaremos la ruta del archivo a descargar a funciones.php quien lo permtirá --> <td> <img width="200px" heigh="150px" src="<?php echo $row['fotocopia_id'] ; ?>"/> </td> <!-- Si deseamos una vista previa de una "IMAGEN" en este formulario basta con colocar en la ruta src de la etiqueta img la ruta del archivo a mostar --> <td><a href="funciones/funciones.php?edocumento=<?php echo $row['fotocopia_id']?>&id=<?php echo $row['identificacion']; ?> ; ">Eliminar</a> </td> <!-- Para eliminar el registro y el archivo de nuestro servidor enviaremos mediante un enlace al archivo de funciones la ruta del archivo y la id de la persona--> </tr> <?php } //cerramos el while ?> </table> Con el fin de optimizar el proceso de descargar y eliminar, empleamos un archivo funciones.php en la carpeta funciones Funciones.php <?php if(isset($_GET['documento'])){ //si llega el parametro por GET documento descargar('../'.$_GET['documento']); //llamará a la función descargar } if(isset($_GET['edocumento'])){ //si llega el parametro edocumento por $_GET eliminar($_GET['edocumento']); //llama a la función elimninar } function descargar($archivo){ //creamos la función descargar y recibimos la ruta del archivo $nombre_archivo = (pathinfo($archivo,PATHINFO_BASENAME)); //obtenemos el nombre del archivo header('Content-Disposition: attachment; filename="'.$nombre_archivo.'"'); //preparamos el archivo para ser descargado y le asignamos un nombre readfile($archivo);//leemos y descargamos el archivo }//cerramos función descargar function eliminar($archivo){ //creamos la función eliminar y recibimos la ruta del archivo require '../conexion.php'; //llamamos el archivo conexion.php $sql ='DELETE FROM persona WHERE identificacion ="'.$_GET['id'].'"'; //eliminamos el registro que que contiene el número de identificación correspondiente $consulta = $mysqli->query($sql);//enviamos esa consulta a la base de datos unlink('../'.$archivo); //la función unlink eliimina al archivo unlink(ruta_archivo); header('location:../index.php'); //redireccionamos a visualizar los datos } //cerramos función eliminar ?> Como resultado de hacer clic sobre el enlace descargar y ejecutar la función de descargar obtendremos nuestro archivo en el navegador como lo muestra la siguiente imagen Si el archivo que decidimos subir es de tipo pdf al hace clic sobre vista previa en una nueva pestaña obtendremos la siguiente vista Finalmente podemos concluir que La función subir permite subir uno o múltiples archivos La función vista previa es válida para imágenes o pdf La función descargar permite la descarga de cualquier archivo Se recomienda que la documentación se adjunte en formato pdf La función eliminar Unlink borra completamente el archivo del aplicativo. Recomendación Importante: Con el fin de brindar seguridad en su aplicativo NO permita subir archivos con extensión de lenguajes de programación como (php,sql,js,etc.) EJERCICIOS: 1. Teniendo en cuenta la función subir y eliminar crear un formulario en el cual le permita al usuario modificar (remplazar) un archivo que se ha subido por él. Lista de referencias. http://php.net/manual/es/function.unlink.php http://php.net/manual/es/features.file-upload.post-method.php http://www.w3schools.com/tags/att_input_multiple.asp