viernes, 8 de abril de 2011

Visualización en la web de documentos almacenados en un campo contenedor

No es la mejor práctica servir los documentos almacenados en un campo contenedor para ser visualizados en la web. Siempre es mejor que esos documentos estén físicamente en el disco duro de nuestro servidor y guardar en un campo de texto la ruta del documento. Pero es posible visualizar directamente el contenido de un campo contenedor en la web y aquí vamos a explicar cómo.

Se suele usar esta técnica para mostrar imágenes de tipo JPEG, GIF o PNG. Pero también es posible hacerlo para cualquier tipo de archivo como pueden ser PDF o MOV (vídeo quicktime).

Vamos a usar de ejemplo una base de datos llamada documentos.fp7 con dos únicos campos. Un campo contenedor llamado documento y otro de cálculo llamado tipo que extraerá la extensión del documento almacenado en documento.

El ejemplo nos mostrará una lista de los archivos guardados y un enlace que abrirá una ventana nueva donde se visualizará el contenido ya sea una imagen, un PDF o una película.

El código PHP que nos muestra el listado de documentos es este:
// Incluimos la librearia FileMaker.
 require_once ('FileMaker.php');
 
 // Establecemos la conexion con la base de datos indicando:
 // base de datos (documentos.fp7)
 // servidor donde esta alojada (127.0.0.1)
 // usuario y password
 $fm =& new FileMaker('documentos.fp7', '127.0.0.1');
 $fm->setProperty('username', 'Admin');
 $fm->setProperty('password', '');
 
 // Buscamos todos los registros.
 $request = $fm->newFindAllCommand('documentos');
 $result = $request->execute();
 
 // Comprobamos que no ha ocurrido ningun error
 if ( FileMaker::isError($result) ) {
  echo '

Error: '. $result->code .': '. $result->getMessage .'

'; die(); } // Obtenemos los registros encontrados $records = $result->getRecords(); // Recorremos en un bucle cada uno de los registros foreach ($records as $record) { // Guardamos el tipo de documento (segun la extension del archivo) $tipo = $record->getField( 'tipo' ); // Al tratarse de un campo contendor lo que nos devuelve // es una url al contenido del archivo $documento = $record->getField( 'documento' ); // Mostramos el tipo de archivo y la url que lo muestra. echo '

'. $tipo .' '. $documento .'

'; // Cuando se trata de archivos GIF o JPG la url que obtenemos // nos muestra esa extension pero con caulaquier otro tipo de // archivo la extension que muestra es: .cnt // ahora vamos a reemplazar .cnt por la extension propia del // del tipo de archivo que queresmo visualizar $doc = str_replace(".cnt", ".". $tipo, $documento); // Mostramos el enlace que nos permitira visualizar el documento echo 'Visualizar documento '. $tipo .''; echo '
'; }

El código PHP que nos permite ver el contenido del campo contenedor es este:
// Incluimos la librearia FileMaker.
 require_once ('FileMaker.php');
 
 // Establecemos la conexion con la base de datos indicando:
 // base de datos (documentos.fp7)
 // servidor donde esta alojada (127.0.0.1)
 // usuario y password
 $fm =& new FileMaker('documentos.fp7', '127.0.0.1');
 $fm->setProperty('username', 'Admin');
 $fm->setProperty('password', '');

 // Comprobamos si se ha pasado la variable -url
 if (isset($_GET['-url'])){ 
  
     $url = $_GET['-url']; 
  
     // Extraemos la extension del fichero
     $url = substr($url, 0, strpos($url, "?"));
     $url = substr($url, strrpos($url, ".") + 1); 
  
  // Segun la extension se estable el Content-type adecuado
  // para su correcta visualizacion
  switch ($url) {
   case "jpg":
    header('Content-type: image/jpeg');
    break;
   case "gif":
    header('Content-type: image/gif');
    break;
   case "pdf":
    header('Content-type: application/pdf');
    break;
   case "mov":
    header('Content-type: video/quicktime');
    break;
   default:
    header('Content-type: application/octet-stream');
  }    
  
     // Mostramos el contenido del campo contenedor
     echo $fm->getContainerData($_GET['-url']); 
  
 } 

El secreto de visualizar correctamente el documento guardado en el campo contenedor está en decirle a navegador que tipo de documento es. Esto se hace especificándoselo en la cabecera del documento a servir mediante la función header()

Para más información sobre la función header() consultar aquí
Lista de Mime-types disponnibles