Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

¿Cómo convertir un varbinary a imagen en Symfony2 DBAL?

13 de febrero de 2016

Hola a todos.

Se las hago cortita. Si les escribo es porque he buscado en Internet, pero estoy confundido y necesito si me pueden echar una ayudadita.

Trabajo con Symfony2, con Doctrine DBAL porque la base de datos no es mía y solo puedo leer los datos. Existe una tabla (SQL SERVER) que tiene imágenes guardadas en varbinary y necesito mostrarlas.

public function getImagen(Connection $conn)
    {
        /* Instanciado de QueryBuilder y construcción de la consulta */
        $qb = $conn->createQueryBuilder()
                ->select('imagen')
                ->from('tabla')
                ->setMaxResults(1);
 
        /* Ejecución de la consulta y obtención de los datos */
        $stmt = $qb->execute();
        $datos = $stmt->fetch();
 
        /* Si no hay datos en la tabla, lanzar una excepción */
        if(!$datos){throw new \Exception('No existen datos en la tabla');}
 
        $imagen = $datos['imagen'];
 
        return $imagen;

Al hacer un vardump a $datos me indica que el dato es un string y es algo como esto:

array(1) {["imagen"]=> string(18868) "89504E470D0A1A0A0000000D..." }

Y de ahí ya no sé qué hacer. No sé cómo convertir ese string en una imagen en el controlador y luego como decirle a twig que la muestre.

Agradecería vuestra orientación, porque en realidad estoy muy perdido. Muchas gracias.

Saludos desde Chile.


Respuestas

#1

Después de muuuuchoooo leer y buscar por la web, logré dar con la solución, y la escribo por si alguien en algún momento le sirve.

Todo mi problema se suscitaba debido al driver que estaba ocupando en Doctrine DBAL para acceder a la base de datos. Por defecto estaba ocupando el driver pdo_sqlsrvr (que por lo demás es el que ocupo cuando trabajo con ORM) pero según la documentación de Microsoft, el driver PDO al leer el tipo de campo varbinary (o varbinary(max) o longbinary), lo pasa como string pero en byte, como el ejemplo que les puse arriba: array(1) {["imagen"]=> string(18868) "89504E470D0A1A0A0000000D..." } En cambio la versión del driver no PDO (sqlsrv) extrae el tipo de campo también en string, pero en este formato: array(1) {["imagen"]=> string(148) "�PNG  IHDR�N...." }

Ya con esto puedo trabajar. Ahora lo puedo convertir en imagen a través de la librería GD de PHP y devolver la imagen, o convertirlo en base64 y pasárselo como parámetro al atributo src del tag <img> de HTML.

Ejemplo de librería GD:

$im = imagecreatefromstring($imagen);
if ($im !== false) {
    header('Content-Type: image/png');
    imagepng($im);
    imagedestroy($im);
}
else {
    echo 'Ha ocurrido un error.';
}

Ejemplo de parámetro al tag <img> de HTML:

$imgBase64 = base64_encode($imagen);
 
echo '<img src="data:image/png;base64,'.$imgBase64.'">';

Yo personalmente ocupé la segunda, pero haciendo uso de las plantillas Twig. Y así fue como solucioné mi problema después de un par de semanas.

Saludos desde Chile

@SebaRiquelmeP

15 febrero 2016, 5:18
#2

@SebaRiquelmeP muchas gracias por aportar la solución y por explicarla tan detalladamente.

@javiereguiluz

15 febrero 2016, 8:34