[SOLUCIONADO] Cargar archivo pdf a la base de datos bytea blob

Hola a todos.
Soy nuevo en el uso de este ‘frame work’, es una excelente herramienta.
Los felicito!

He implementado un ABM semejante al de personas donde hay un ejemplo de como cargar una imagen a la base de datos y mostrar el preview en el formulario. Lo construí muy rápido y funciona perfectamente. Asi que pense, para cargar un pdf debe ser muy semejante asi que manos a la obra… Y no he logrado hacerlo funcionar.

Hice unos pequeños cambios:

<?php
//---- Formulario -------------------------------------------------------------------
49   
50      function conf__formulario(toba_ei_formulario $form)
51      {
52          if ($this->dep('datos')->esta_cargada()) {
53              $datos = $this->dep('datos')->tabla('solicitudes')->get();
54              $fp_certificado = $this->dep('datos')->tabla('solicitudes')->get_blob('pdf_certificado');
55          // Poner el vinculo al archivo
56          if (isset($fp_certificado)) {
57                //-- Se necesita el path fisico y la url de una archivo temporal que va a contener la imagen
58                $temp_nombre = md5(uniqid(time()));
59                $temp_archivo = toba::proyecto()->get_www_temp($temp_nombre);
60      
61                //-- Se pasa el contenido al archivo temporal
62                $temp_fp = fopen($temp_archivo['path'], 'w');
63                stream_copy_to_stream($fp_certificado, $temp_fp);
64                fclose($temp_fp);
65                $tamaño = round(filesize($temp_archivo['path']) / 1024);
66                
67                //-- Se muestra la imagen temporal
68                $datos['vinculo_certificado'] = "<a href='{$temp_archivo['url']}'>Ver certificado</a>";
69                $datos['pdf_certificado'] = 'Tamaño: '.$tamaño. ' KB';
70          } else {
71              $datos['pdf_certificado'] = null;
72          }
73   
74          $form->set_datos($datos);
75          } else {
76              $this->pantalla()->eliminar_evento('eliminar');
77          }
78      }
79   
?>

Al procesar el formulario el archivo al parecer carga al servidor, pues en el arreglo de datos sale la descripción, como se ve en el log.
Pero no lo carga a la base de datos.

Iniciando componentes... componente(2391): Pantalla de eventos: 'pant_edicion' Procesando eventos... componente(2391): [ inicializar_dependencias ] array ( 0 => 'formulario', ) componente(2389): IMPLICITO: modificacion componente(2391): [ registrar_evento ] 'modificacion' -> [ evt__formulario__modificacion ] array ( 0 => array ( 'solicitud' => '9', 'pedido' => NULL, 'cotizacion' => NULL, 'empresa' => '1558', 'contacto_servicio' => NULL, 'direccion_servicio' => NULL, 'telefono_servicio' => NULL, 'email_servicio' => NULL, 'estado' => '6', 'fecha_asignacion' => NULL, 'fecha_agendada' => NULL, 'fecha_ejecucion' => NULL, 'fecha_aprobacion' => NULL, 'observaciones' => NULL, 'horas_desplaz' => NULL, 'tipo_servicio' => '9', 'servicio' => '10', 'fecha' => '2010-05-25', 'fecha_cierre' => '2010-06-23', 'lider' => NULL, 'asesor' => NULL, 'pdf_protocolo' => NULL, 'vinculo_certificado' => NULL, 'pdf_certificado' => array ( 'name' => 'certificado.pdf', 'type' => 'application/pdf', 'tmp_name' => '/tmp/phpYCarWr', 'error' => 0, 'size' => 106057, ), ), ) componente(2553): dt_solicitudes El registro tiene una estructura incorrecta: El campo 'vinculo_certificado' no forma parte de la DEFINICION. componente(2391): [ evento ] 'guardar' -> [ evt__guardar ] ************ ABRIR transaccion (sglmain_vx@localhost) **************** AP_TABLA: [solicitudes] No hay campos para hacer el UPDATE ************ CERRAR transaccion (sglmain_vx@localhost) **************** TABLA: [solicitudes] RESET!! TABLA: [solicitudes] Se resetea el cursor componente(2391): [ callback ] 'evt__pant_edicion__salida' no fue atrapado componente(2391): [ callback ] 'evt__pant_seleccion__entrada' no fue atrapado Configurando dependencias para responder al servicio... componente(2391): Pantalla de servicio: 'pant_seleccion' componente(2391): [ callback ] 'conf__pant_seleccion' no fue atrapado componente(2391): [ callback ] 'conf__filtro' Se filtro el evento: cancelar componente(2391): [ callback ] 'conf__cuadro' Respondiendo al servicio__generar_html...

Les agradezco su gentil colaboración, he buscado en el manual y en el foro pero no encuentro donde esta el problema. Tengo instalada la versión 1.4.9 sobre Linux CentOS.

Saludos,

Jaime M.

Hola Jaime,

ante todo bienvenido, me alegra oir que el framework te ha sido de utilidad, con respecto a tu problema te voy a pedir que me copies el codigo perteneciente al evento evt__formulario__modificacion(), por lo que veo los datos llegan correctamente hasta el servidor… pero luego el datos_tabla no se entera que hubo cambios, eso me llama la atencion.

Saludos :slight_smile:

Muchas gracias Ricardo, efectivamente tenia mal el evento. Solo me faltaba un “pedacito de codigo”… Ya me funciona la carga del pdf.
Ahi va el codigo indicando las líneas que me hacian falta. Yo revise muchas veces… pero se me paso ese detalle…

<?php
  function evt__formulario__modificacion($datos)
  {
    $this->dep('datos')->tabla('solicitudes')->set($datos);   
                                              // LA VERDAD ME FALTABA DE AQUI
    // Cargar archivo
    if (is_array($datos['pdf_certificado'])) {
      //Se subio una imagen
      $fp = fopen($datos['pdf_certificado']['tmp_name'], 'rb');
      $this->dep('datos')->tabla('solicitudes')->set_blob('pdf_certificado', $fp);
    }
                                              // HASTA AQUI
  }

?>

Los ejemplos del proyecto referencia son suficientemente claros. Nuevamente Gracias.

Saludos,

Jaime M.