[SOLUCIONADO]como obetener una imagen desde la base de datos ejecutando un event

Hola, no podemos regenerar una imagen que hemos guardado en la base de datos. Tratamos de usar este codigo y no tenemos resultado.
function get_cen_archivos()
{
$datos = $this->dep(‘datos’)->tabla(‘dig_archivo’)->get_listadoId(1);
$i=0;

    foreach ($datos as $elem) {
        $fp_imagen = $this->dep('datos')->tabla('dig_archivo')->get_blob('imagen',1);
        // $fp_imagen=  ifx_get_blob($elem['imagen']);
        if (isset($fp_imagen)) {
            //-- Se necesita el path fisico y la url de una archivo temporal que va a contener la imagen
            $temp_nombre = 'arch' . $elem['id'].'.jpg';
            $temp_archivo = toba::proyecto()->get_www_temp($temp_nombre);
                echo ("Temp: ".$temp_archivo);          
            //-- Se pasa el contenido al archivo temporal
            $temp_fp = fopen($temp_archivo['path'], 'w');
            stream_copy_to_stream($fp_imagen, $temp_fp);
            fclose($temp_fp);
            $tamano = round(filesize($temp_archivo['path']) / 1024);
                                
            //-- Se muestra la imagen temporal
            $enlace="<a href='{$temp_archivo['url']}'>Descargar</a>";
            $elem['imagen'] =$enlace;
            $elem['vista_previa'] = "<img src='{$temp_archivo['url']}' alt='retert' WIDTH=200 HEIGHT=200>";
        } else {
            $elem['imagen'] = null;
        }
        $datos[$i]=$elem;
        $i=$i+1;
    } 
    return $datos;
}

Hola Estimados, Explico un poco mejor lo que pasa:

Estoy teniendo problemas, lo que necesito hacer, es seleccionar de un
cuadro multiseleccion un elemento de una tabla que contiene un
archivo en formato blob y enviarlo por email.
Bueno hice una funcion en el datos tabla que le envio un id y me
devuelve el registro de la tabla get_listadoId($id),
--------------------------------------------- funcion

function get_listadoId($id)
{

    $sql = "SELECT
      t_da.id,
        t_da.numero,
        t_da.fecha_creacion,
        t_da.imagen,  ///  Dato de tipo bytea  o Blob
        t_da.planilla_pdf,
        t_da.planilla_pdf_firmada,
        t_da.nombre_arch,
        t_da.anio,
        t_da.descripcion,
        t_dt.tema_nombre as fk_tema_nombre,
        t_dtd.tdoc_nombre as fk_tipo_doc_nombre,
        t_de.est_nombre as fk_estado_nombre,
        t_de1.emi_nombre as fk_emisor_nombre    FROM

dig_archivo as t_da where t_da.id = ".$id;

    return toba::db('digesto')->consultar($sql);

}

luego------------------------------------------

//obtengo el dato que necesito
$datos = $this->dep(‘datos’)->tabla(‘dig_archivo’)->get_listadoId(1);

// quiero cargar el cursor, pero me da error
$this->dep(‘datos’)->tabla(‘dig_archivo’)->cargar($datos[0]);

// entonces no puedo recuperar el dato con el get_blob(‘imagen’);
$fp_imagen = $this->dep(‘datos’)->tabla(‘dig_archivo’)->get_blob(‘imagen’);

Con esta funcion (get_listadoId(1)), pasandole como parametro una
variable de entorno, donde guardo los datos seleccionados en la tabla,
obtengo
el dato que necesito.
Lo que no se hacer, es cargar el cursor con ese dato obtenido para
poder realizar el tratamiento de la imagen, con el get_blob(‘imagen’)
me da el siguiente error al cargar el dato.
----------------------------------------------ERROR-----------------------------------------------------
SQLSTATE: db_42601

CODIGO: 7

MENSAJE: Error cargando la tabla dig_archivo, a continuación el
mensaje de la base:
ERROR: syntax error at or near “AND” LINE 19: dig_archivo.imagen = AND ^

SQL: SELECT dig_archivo.id, dig_archivo.numero,
dig_archivo.fecha_creacion, dig_archivo.planilla_pdf_firmada,
dig_archivo.nombre_arch, dig_archivo.anio, dig_archivo.descripcion,
dig_archivo.fk_tema, dig_archivo.fk_tipo_doc, dig_archivo.fk_estado,
dig_archivo.fk_emisor FROM dig_archivo as dig_archivo WHERE
dig_archivo.id = “1” AND dig_archivo.numero = “99” AND
dig_archivo.fecha_creacion = “2017-06-05” AND dig_archivo.imagen = AND
dig_archivo.planilla_pdf IS NULL AND dig_archivo.planilla_pdf_firmada
= “0” AND dig_archivo.nombre_arch = “toba_1.2.0 (1).pdf” AND
dig_archivo.anio = “2015” AND dig_archivo.descripcion = “dfasdfasdf”
AND dig_archivo.fk_tema = “1” AND dig_archivo.fk_tipo_doc = “1” AND
dig_archivo.fk_estado = “1” AND dig_archivo.fk_emisor = “2” –
toba_log: 867022939

al parecer el metodo no recupera el dato de tipo bytea(
dig_archivo.imagen no viene ese campo), me da el error al tratar de
cargarlo, por eso no puedo recuperar con el get_blob(‘imagen’) la
imagen cargada.

Tenes alguna idea de lo que estoy haciendo mal o como lo deberia hacer
para que funcione.

Dese ya muchas gracias y saludos.

Hola Cristian,

si tenes el id del registro al que queres acceder… por que no hacer directamente eso?, digo para que hacer la consulta?

 $this->dep('datos')->tabla('dig_archivo')->cargar($datos[0]);

Por otro lado, aca tenes un problema porque le estas pasando un recordset al cargar, que va a fallar porque hay columnas que no existen… por ej: fk_estado_nombre, o como te pasa mas abajo intenta filtrar por el campo bytea que al ser un resource no puede pegarlo al where.

Fijate que el where tiene muchos mas campos de los que deberia, con la clave de la tabla alcanza y sobra.


WHERE
dig_archivo.id = "1" AND dig_archivo.numero = "99" AND
dig_archivo.fecha_creacion = "2017-06-05" AND dig_archivo.imagen = AND
dig_archivo.planilla_pdf IS NULL AND dig_archivo.planilla_pdf_firmada
= "0" AND dig_archivo.nombre_arch = "toba_1.2.0 (1).pdf" AND
dig_archivo.anio = "2015" AND dig_archivo.descripcion = "dfasdfasdf"
AND dig_archivo.fk_tema = "1" AND dig_archivo.fk_tipo_doc = "1" AND
dig_archivo.fk_estado = "1" AND dig_archivo.fk_emisor = "2"

Si solucionas la carga de la tabla, no deberias tener mayor inconveniente en recuperar el campo bytea.

Saludos

Dimos solución al problema con el siguiente código:

function get_cen_archivos()
{
$seleccionArc = $this->s__datos_seleccionadosArchiv;
$datos = $this->dep(‘datos’)->tabla(‘dig_archivo’)->get_listadoId($seleccionArc[0][‘id’]);

    $fp_imagen = $datos[0]['imagen'];
    if (isset($fp_imagen)) {
            //-- Se necesita el path fisico y la url de un archivo temporal que va a contener la imagen
            $temp_nombre = md5(uniqid(time()));
            $temp_archivo = toba::proyecto()->get_www_temp($temp_nombre);
            //-- Se pasa el contenido al archivo temporal
            $temp_fp = fopen($temp_archivo, 'w');
            stream_copy_to_stream($fp_imagen, $temp_fp);
            fclose($temp_fp);
          
            return "<a href='http://localhost/archivo2/".$temp_nombre."' target='_blank'>Ver Documento</a>";
    } else {
        $datos['imagen'] = null;
    }
    return $datos;

}

Espero que a alguien le sirva :slight_smile: