¿Cómo guardar y mostrar una imagen desde PostgreSQL con PHP?

Para poder alojar una imagen o archivo dentro de una Base de Datos, debemos definirle un tipo de dato especial para este formato, en el caso de PostgreSQL usamos el tipo de dato bytea. Para poder leer y almacenar una foto u archivo X, el trato en este campo no tiene ninguna dificultad, por que se trata como cualquier otro valor a la hora de hacer un INSERT o UPDATE. A continuación se muestra la receta ideal mediante un ejemplo con una tabla y los códigos necesarios en PHP.

Estructura de la tabla: El siguiente código SQL, muestra cual es el tipo de dato que debe tener una tabla que aloja imágenes, en este caso existe un campo llamado foto de tipo bytea.

CREATE TABLE tbl_usuarios
(
  id serial NOT NULL,
  nombre character varying(60) NOT NULL,
  apellido character varying(60) NOT NULL,
  foto bytea
)

Subir una imagen: El siguiente archivo llamado save.php, es el encargado de subir el archivo de una imagen a la base de datos.

$data = file_get_contents('1.jpg');
$image = pg_escape_bytea($data);
$conn = pg_connect("user=DB password=admin dbname=DB host=localhost");

pg_query($conn, "UPDATE usuarios SET foto = '{$image}' WHERE id = 1");
pg_close($conn);

Cargar una imagen: El siguiente archivo llamado display.php, es el encargado de buscar y mostrar la imagen alojada en la base de datos, el resultado de este archivo es el de convertirse una imagen, y es llamado desde el código HTML, por eso se modifica el header.

$conn  = pg_connect("user=DB password=admin dbname=DB host=localhost");
$query = pg_query($conn, "SELECT foto FROM usuarios WHERE id = 1");
$row   = pg_fetch_row($query);
$image = pg_unescape_bytea($row[0]);

header("Content-type: image/jpeg");
echo $image;

pg_close($conn);

Nota: Recordar de mantener el mismo formato que se guarda y el header al leer el archivo.

Mostrar una imagen: El siguiente archivo llamado foto.html, contiene los tags necesarios para mostrar la imagen, podemos observar que se llama al archivo anterior y esta definido en la propiedad que indica la ruta de la imagen.

<h1>Foto:</h1>
<img src="display.php"

iReport como herramienta de reportes profesionales y su integración con PHP

Todo sistema de información requiere emitir documentos útiles para ser usados diariamente en la empresa, sea de cualquier formato; PDF, DOC, XLS (Con formulas), que contenga listas y/o gráficos, todo esto se hace muy atractivo al usuario final, y fortalece las tomas de decisiones.

Claro que cuando trabajamos en PHP, este tipo de recurso escasea (para no decir que existe) desde un sentido profesional, solamente existen librerías a las que nos ayuda a crear cada tipo de documentos y embeber; gráficos, formulas, imágenes, códigos de barra, etc… y se vuelve totalmente impráctico su implementación, por la simple razón que nos lleva mucho tiempo hacer un buen trabajo mediante la codificación, y necesitamos herramientas de tipo wysiwyg que faciliten y genere un estándar de trabajo.

Durante mucho tiempo se ha buscado este tipo de programa en la empresa, ¡hasta que se dio en el clavo!, se probo y como resultado; genero mucha satisfacción de ambas partes (programadores y usuarios finales), claro, después de haber evaluado varias herramientas. Esta maravilla se llama iReport, está escrita en Java y es OpenSource en su versión CE, básicamente hace todo lo que se requiere, solo basta conocer las buenas practicas y tener creatividad.

Todo esto suena maravilloso, pero se nos presenta la siguiente inquietud ¿Como lo integro con mi desarrollo en PHP? bueno muy simple, esta herramienta genera un XML llamado “.jrxml” y un compilado “.jasper” este se tiene que subir a un servidor llamado JasperServer, mediante el uso de un WebServices o Interfaz WEB, por cualquier de los dos medios se puede generar el formato de archivo deseado como salida, o utilizando las librerías en Java que se llaman JasperReports para crear nuestras propias herramientas.

Pero como toda empresa que ofrece optimas soluciones a nivel OpenSource, existe limitaciones para este tipo de servicios “gratuitos”, ya que si queremos todas sus funcionalidad (librerías por ejemplo; iText) debemos comprar la versión Pro. Existe otra empresa que pueden salvarnos y tienen un servidor equivalente, llamado OpenReport, mas abierto y con un poco más de librerías de reportes, siguen ofreciendo los WebServices o Interfaz WEB, puede que nos veamos limitados dependiendo de nuestras exigencias, pero si vamos a la versión paga no existirán restricciones de ningún tipo mientras exista su funcionalidad en las librerías.

Con este análisis no quiero asustar a los lectores y quitarles el interés, más bien, los reportes normales de uso cotidiano y comunes los pueden hacer perfectamente utilizando las herramientas de JasperServer, y la generación de archivos de tipo PDF quedan muy optimas sin importar su complejidad, en otros casos habría que evaluar los requisitos y la capacidad de dicha herramienta en casos muy puntuales, la verdad es que es una solución maravillosa.