Resultados 1 al 7 de 7

Tema: Exportando BLOBs desde Firebird

  1. #1
    Chuck Norris
    Avatar de Amenadiel
    Fecha de ingreso
    15 Jan, 04
    Ubicación
    Santiago de Chile
    Mensajes
    22,675

    Exportando BLOBs desde Firebird

    Tengo una base Firebird, y estoy usando PHP para recorrer una tabla que contiene BLOBs e irlos exportando a archivos.

    El blob se almacena en un string, y ese string lo copio en un archivo usando fopen(archivo,'wb') para que lo escriba en binario. Sin embargo, los archivos resultantes son puros garabatos, y lo curioso es que empiezan con lo que sería la extensión, por ejemplo

    DOC|25600[S]%%d...Gp........|

    o

    RTF|5087[S]%.....S........es

    o

    PDF|1799982[S]%Sw.....V...


    empiezo a pensar que habría que guardar el string con un offset, por ejemplo avanzar hasta el primer %. Pero no me resulta. ¿Qué estoy haciendo mal? Será que al leer el BLOB con un string lo estoy convirtiendo implícitamente a texto?

    En todo caso, todos los GUI de base de datos me muestran pura basura en esos blobs. Fueron insertados mediante un software propietario para manejo de documentos legales, el Lex 9, pero no puedo usarlo para tratar de leer o extraer los datos.

  2. #2
    Pajarito Nuevo Avatar de DbaAccidental
    Fecha de ingreso
    02 Jan, 12
    Mensajes
    10

    Re: Exportando BLOBs desde Firebird

    Voy a hacer un prueba y te cuento ...

    ---------- Post added at 18:52 ---------- Previous post was at 18:40 ----------

    Como estas haciendo la conversión de blob a string?
    Got DB ?

    Visita mi blog!

    www.dbaporaccidente.blogspot.com

  3. #3
    Chuck Norris
    Avatar de Amenadiel
    Fecha de ingreso
    15 Jan, 04
    Ubicación
    Santiago de Chile
    Mensajes
    22,675

    Re: Exportando BLOBs desde Firebird

    Gracias DBA, al final logré solucionarlo.

    Les cuento: instalé el demo de LEX9, creé un caso y al caso le puse un movimiento y al movimiento le adjunté un archivo. Me conecté a la base de datos del demo y comprobé que ese archivo que adjunté estaba en el mismo formato extension-numero-basura y que al exportarlo por fwrite quedaba un archivo inservible.

    Ahora, cómo estaba pasando de BLOB a String? Este era más o menos el código

    Código PHP:
            $rid = @ibase_query ($connection"select ID, DESCRIPCION, BLOB from TABLA");
        while (
    $row ibase_fetch_row ($rid)) {
     
              
    $blobdata=ibase_blob_info($row[2]);
                
    $blobid ibase_blob_open($row[2]);
                
                
    $filename='D:/movi/'.$row[1];
                
    $data=ibase_blob_get($blobid,$blobdata[0]);
                
    ibase_blob_close($blobid);
                
    $fp fopen($filename.'.'.$ext'wb');
                
    fwrite($fp$data);
                
    fclose($fp);

        }

        
    ibase_close ($connection); 
    Pero me daba archivos basura. Claramente había una encriptación o encapsulamiento por parte del software antes de meter el archivo en Firebird.

    Rebuscando, encontré que el fabricante provee un dll (LEX-DOCTOR, LD-Com). Lo bajé y venía junto con un documento que lista los métodos. Lo malo es que no decía de qué era el DLL, pero para probar suerte, lo metí a Windows System32, lo registré con regsvr32, y luego cara de raja lo probé en PHP tratándolo como objeto... y funcionó.

    Resulta que la DLL provee un método loadfromstring y otro savedocumenttofile. Eso entre muchos otros métodos que no entendi ni usé. Básicamente, las funciones se encargan de pasar de archivo->documento->base de datos y a la inversa. Ese paso intermedio "documento" era el encapsulado que me faltaba.

    el código quedó así

    Código PHP:
    $sobre = new COM("lexcom.sobre");
            
    $rid = @ibase_query ($connection"select ID, DESCRIPCION, BLOB from TABLA");
        while (
    $row ibase_fetch_row ($rid)) {
     
              
    $blobdata=ibase_blob_info($row[2]);
                
    $blobid ibase_blob_open($row[2]);
                
                
    $filename='D:/movi/'.$row[1];
                
    $data=ibase_blob_get($blobid,$blobdata[0]);
                
    ibase_blob_close($blobid);
             
    $sobre->Clear();

            
    $sobre->LoadFromString($data);
            
    $sobre->GetDocument();
            
    $tipo=$sobre->GetDocumentType();
                
    $sobre->SaveDocumentToFile($filename.'.'.$tipo);
                    

        }

        
    ibase_close ($connection); 
    funciona de pelos.

  4. #4
    Pajarito Nuevo Avatar de DbaAccidental
    Fecha de ingreso
    02 Jan, 12
    Mensajes
    10

    Re: Exportando BLOBs desde Firebird

    Cita Iniciado por Amenadiel Ver mensaje
    Gracias DBA, al final logré solucionarlo.

    Les cuento: instalé el demo de LEX9, creé un caso y al caso le puse un movimiento y al movimiento le adjunté un archivo. Me conecté a la base de datos del demo y comprobé que ese archivo que adjunté estaba en el mismo formato extension-numero-basura y que al exportarlo por fwrite quedaba un archivo inservible.

    Ahora, cómo estaba pasando de BLOB a String? Este era más o menos el código

    Código PHP:
            $rid = @ibase_query ($connection"select ID, DESCRIPCION, BLOB from TABLA");
        while (
    $row ibase_fetch_row ($rid)) {
     
              
    $blobdata=ibase_blob_info($row[2]);
                
    $blobid ibase_blob_open($row[2]);
                
                
    $filename='D:/movi/'.$row[1];
                
    $data=ibase_blob_get($blobid,$blobdata[0]);
                
    ibase_blob_close($blobid);
                
    $fp fopen($filename.'.'.$ext'wb');
                
    fwrite($fp$data);
                
    fclose($fp);

        }

        
    ibase_close ($connection); 
    Pero me daba archivos basura. Claramente había una encriptación o encapsulamiento por parte del software antes de meter el archivo en Firebird.

    Rebuscando, encontré que el fabricante provee un dll (LEX-DOCTOR, LD-Com). Lo bajé y venía junto con un documento que lista los métodos. Lo malo es que no decía de qué era el DLL, pero para probar suerte, lo metí a Windows System32, lo registré con regsvr32, y luego cara de raja lo probé en PHP tratándolo como objeto... y funcionó.

    Resulta que la DLL provee un método loadfromstring y otro savedocumenttofile. Eso entre muchos otros métodos que no entendi ni usé. Básicamente, las funciones se encargan de pasar de archivo->documento->base de datos y a la inversa. Ese paso intermedio "documento" era el encapsulado que me faltaba.

    el código quedó así

    Código PHP:
    $sobre = new COM("lexcom.sobre");
            
    $rid = @ibase_query ($connection"select ID, DESCRIPCION, BLOB from TABLA");
        while (
    $row ibase_fetch_row ($rid)) {
     
              
    $blobdata=ibase_blob_info($row[2]);
                
    $blobid ibase_blob_open($row[2]);
                
                
    $filename='D:/movi/'.$row[1];
                
    $data=ibase_blob_get($blobid,$blobdata[0]);
                
    ibase_blob_close($blobid);
             
    $sobre->Clear();

            
    $sobre->LoadFromString($data);
            
    $sobre->GetDocument();
            
    $tipo=$sobre->GetDocumentType();
                
    $sobre->SaveDocumentToFile($filename.'.'.$tipo);
                    

        }

        
    ibase_close ($connection); 
    funciona de pelos.
    Excelente.Yo tenía una situación similar. sólo pdf´s guardados como binarios.
    Got DB ?

    Visita mi blog!

    www.dbaporaccidente.blogspot.com

  5. #5
    Pajarito Nuevo
    Fecha de ingreso
    05 Nov, 12
    Mensajes
    2

    Re: Exportando BLOBs desde Firebird

    Hola Amenadiel y dbaaccidental. Perdón por reabrir el post. Pero son los únicos que he encontrado que han conectado a la base de lex.
    Podrían indicarme con qué programa y con que usuario y contraseña se conectaron con la base de datos? Usan las que trae por defecto firebird?
    usuario SYSDBA con la clave masterkey o utilizan otro método de conexión?
    Intento conectar con flamerobin y no puedo establecer la conexión.
    Cualquier información será bienvenida.
    Saludos.
    Jukinch

  6. #6
    Pajarito Nuevo
    Fecha de ingreso
    05 Nov, 12
    Mensajes
    2

    Re: Exportando BLOBs desde Firebird

    Al final pude conectar
    con usuario SYSDBA y clave masterkey pero directamente desde FLamerobin al archivo LEX9.FDB. Sin tener encendido el servidor.
    Saludos.
    Jukinch

  7. #7
    Pajarito Nuevo
    Fecha de ingreso
    20 Jun, 14
    Mensajes
    1

    Re: Exportando BLOBs desde Firebird

    Hola!
    Podrias subir esa libreria de LDCOM, porq enla web del proveedor ya no esta!!

    Gracias! y muy buieno el aporte!!!!

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •  
*