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 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:

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!!!

Artículos relacionados:

Comparte:
  • Digg
  • Reddit
  • StumbleUpon
  • del.icio.us
  • BlinkList
  • NewsVine
  • Technorati
  • Google Bookmarks
  • MySpace
  • Facebook
  • Twitter
  • Meneame