Hace poco hablaba con mis amigos Álvaro y Joan sobre como cargar contenidos en php que se encuentran en la parte privada de nuestro servidor y les dije que en cuanto tuviera un rato libre escribiría un tutorial, así es que aquí lo tienen.
Introducción, por lo general nuestro servidor suele venir con alguna de las siguientes carpetas:
- web
- www
- httpdocs
En estas carpetas es donde se almacena todo el contenido al que el usuario puede acceder mediante http (salvo restringirlo mediante un fichero .htaccess).
Supongamos que tenemos un proyecto en el que necesitamos guardar los contenidos en la parte privada, es decir, en una carpeta por ejemplo al mismo nivel que nuestra carpeta pública (web, www, httpdocs) para así evitar que se acceda a estos contenidos mediante una petición http, pero que la aplicación necesitará acceder a estos contenidos. Aquí es donde viene tiene sentido este post, jejeje :D.
Bueno, para poder acceder a estos contenidos necesitamos contar con tres piezas:
- La ruta del fichero y el nombre del fichero
- Conocer el content type (MIME)
- Tamaño del fichero
La primera la tenemos que conseguir de alguna forma a través de nuestra aplicación, la segunda partirá del tipo de fichero y la tercera la obtenemos a partir de la primera, jejeje.
Ahora si, sin más historias pongo el código de ejemplo que hice para este pequeño tutorial:
<?php //Configuramos la tabla de tipo $tipos = array(); $tipos['xml'] = array("text", "xml"); $tipos['swf'] = array("application", "x-shockwave-flash"); $tipos['pdf'] = array("application", "pdf"); $tipos['ppt'] = array("application", "vnd.ms-powerpoint"); $tipos['doc'] = array("application", "vnd.ms-word"); $tipos['xls'] = array("application", "vnd.ms-excel"); $tipos['zip'] = array("application", "x-zip-compressed"); $tipos['rar'] = array("application", "x-rar-compressed"); $tipos['gif'] = array("image", "gif"); $tipos['png'] = array("image", "png"); $tipos['jpg'] = array("image", "jpg"); $tipos['flv'] = array("video", "x-flv"); //Definimos la ruta base de los ficheros $ruta_base_fichero = "../contenidos/fichero_"; //Recogemos el tipo de fichero que nos solicitan $tipo_fichero = $_GET['fichero']; //Obtenemos la ruta del fichero combinando la rutaBaseFichero y el tipo_fichero $ruta_fichero = $ruta_base_fichero . $tipo_fichero . "." . $tipo_fichero; //Verificamos que el fichero exista, en caso contrario interrumpimos la ejecucion del proceso. if(!file_exists($ruta_fichero)) die("El fichero solicitado no existe."); //Obtenemos el tamanyo del fichero $tamano_fichero = @filesize($ruta_fichero); //Indicamos en la cabecera el tipo de fichero, para esto utilizamos la tabla de tipos que creamos en la parte superior header("Content-Type:" . $tipos[$tipo_fichero][0] . "/" . $tipos[$tipo_fichero][1]); //Indicamos en la cabecera el nombre del fichero, para esto utilizamos la variable $ruta_fichero, esto es para que el navegador entienda que el fichero no es contenidos.php sino el fichero solicitado header("Content-Disposition: inline; filename=\"" . rawurlencode(basename($ruta_fichero)) . "\""); //Indicamos en la cabecera el tamanyo del fichero header("Content-Length:" . $tamano_fichero); header("Accept-Ranges:" . $tamano_fichero); @readfile($ruta_fichero); ?>
El código está comentado, casi línea a línea, para que quede más claro. Puede optimizarse muchísimo el código, se pueden encapsular constantes, crear clases para reutilizarlo y muchísimas más cosas, pero el fin de este ejemplo es que sirva para iniciarse y entender como consumir contenidos en php de la parte privada de nuestro sevidor.
A continuación los ejemplos:
- Fichero xml.
- Fichero swf.
- Fichero pdf.
- Fichero ppt.
- Fichero doc.
- Fichero xls.
- Fichero zip.
- Fichero rar.
- Fichero gif.
- Fichero png.
- Fichero jpg.
- Fichero flv, jejeje, este no lo subí :P.
Todos los ficheros están en la parte privada de mi servidor, por tanto desde http no se puede acceder a ellos, de tal forma que para acceder a ellos se pasa por un router que es un fichero php que puede acceder a los ficheros y devolverlos.
Un beneficio muy importante que obtenemos al hacer uso de esta metodología es que podemos almacenar en un fichero de log o en base de datos todas las peticiones que se hagan y así tener más controlado el acceso a estos ficheros, pero bueno este tema da para otro post así que lo dejamos de momento aquí :P.
Espero haberme explicado claramente, si tienen cualquier duda para eso están los comentarios. Ojalá les sea de utilidad. Saludos!!!
9 replies on “Tutorial PHP – Leer ficheros de parte privada”
Excelente explicación Luis, es algo muy práctico para según que tipos de contenidos!
Supongo que RIAlity utilizará algún sistema parecido pero en JAVA para cargar los ficheros SWF desde la parte privada de la aplicación.
Existen multitud de usos que se le puden dar a este sistema, pero todo depende de las necesidades del proyecto.
Saludos y gracias por el comentario Marcos 😀
Hola Luis, gracias por tu tutorial, muy muy util.
Sólo una pregunta más… se podría hacer lo mismo para subir ficheros a través de php? Quiero decir, podríamos alojar dichos ficheros en partes privadas del website de forma automática?
Un saludo Luis!
Hola Álvaro, claro que si se puede. Normalmente cuando subes fichero al servidor, estos se alojan en la carpeta temporal por defecto, la actividad habitual es mover el fichero al directorio de destino deseado, este directorio de destino puede estar en la parte privada o en la parte pública.
Saludos!!!
Esto es realmente interesante, no te canses de hacer estos Tutoriales porque son grandisimos!!
Gracias por los ánimos Joan, siempre que me den buenas ideas, sepa como hacerlo y tenga tiempo seguiré escribiendo tutoriales.
Saludos!!!
El script funciona bien pero me da error cuando descargo los ficheros. Ejemplo: archivos.rar, la verdad no se porque se me descargan de manera enbasurada. Qué debo configurar en el server para que no me ocurra eso?
Hola Williams, necesitaría que me dieras más pistas:
¿Qué error te dá?
¿Te pasa con todos los ficheros o sólo con los rar?
¿A que te refieres con “de manera enbasurada”?
En principio no hay que configurar nada particularmente. Este ejemplo lo he probado con un WAMP, un MAMP y mi hosting (www.dreamhost.com) tal como viene la configuración por defecto.
Saludos y me alegro que te sea de utilidad el tutorial.
[…] Tutorial PHP – Leer ficheros de la parte privada […]