[Lazarus-es] Gravar imagen en capo Bytea de PostgreSQL.

Jesus Reyes A. jesusrmx en gmail.com
Mie Mayo 9 01:24:28 CEST 2018


  En Fri, 27 Apr 2018 07:07:16 -0500, Alfonso Arias Lemas via Lazarus-es  
<lazarus-es en lists.lazarus-ide.org> escribió:

>
>
> Buenos dias colegas.
>
>
> Alguien a trabajado con imagen alguna vez en campo “Bytea” de  
> PostgreSQL. Necesito guardar y leer fotos, y todo tipo de >ficheros, de  
> Excel, Word y PDF. Normalmente cuando deseo hacer eso codifico el  
> fichero a BASE64 y lo guardo en un campo >“Text” pero el caso es que  
> ahora me dan las imágenes ya guardada en una tabla de PostgreSQL con  
> alrededor de 100 mil fotos y >todas están en campo Bytea y me resulta  
> difícil sacarlas de ahí y además no tengo idea como adicionar nuevas.
>
>
> Alguna sugerencia por favor???
>
>
> Saludos,
>
>   Alfonso
>
>
>

Hola Alfonso,

Me ha tomado un poco de tiempo poder hacer pruebas con Postgres, que es  
una base de datos con la que yo no trabajo normalmente y me he encontrado  
algunos problemillas de ahí que no haya podido contestar antes, espero aún  
te sirva la información.

Suponiendo que deseas trabajar con sqldb, existen varias formas de acceder  
a los datos binarios contenidos en un campo blob, te comento uno que  
funciona con cualquier base datos.

Suponiendo que ya tienes una consulta, digamos query, en la cual tienes  
varios registros, lo siguiente te guardar los datos contenidos en un campo  
'BLOB' en archivos en la el directorio de la aplicación.



var
   ..
   M: TMemoryStream;
   BlobStream: TStream;
...


   //
   // PARA LEER UN CAMPO BLOB
   //
   BlobStream := query.CreateBlobStream(query.FieldByName('BLOB'), bmRead);
   M.Clear;
   M.CopyFrom(BlobStream, 0);
   // ahora el stream M tiene el contenido del campo blob
   // puedes guardarlo, usar fpSpreadsheet para abrir el contenido de hojas  
de calculo, etc.
   ...
   BlobStream.Free;


   //
   // PARA MODIFICAR UN CAMPO BLOB
   //
   query.Edit; // query en estado de edicion
   F := query.FieldByName('BLOB');
   F.Clear; // comenzando el campo 'en vacio'
   with query.CreateBlobStream(F, bmWrite) do begin  // esto crea un stream  
listo para usarse
     CopyFrom(M, M.Size); // M es un stream con los nuevos datos a  
almacenar en la BDD
     Free; // liberamos en stream que CreateBlobStream crea
   end;
   query.Post;           // guardamos los cambios en el registro
   query.ApplyUpdates;   // aplicamos los cambios en la BDD
   tranQuery.Commit;     // cerramos la transacción guardando los cambios  
aplicados.


   Otra forma de acceso es usando F.AsBytes que regresa o acepta un array  
dinámico de bytes.

   En caso de consultas directas usando INSERT o UPDATE puedes usar una  
consulta con parámetros y luego usar  
queryDirect.ParamByName('BLOB').SetBlobData(M.Memory, M.Size); por ejemplo.

Bueno espero te sirva, saludos.

Jesus Reyes A.
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20180508/1afc3757/attachment.html>


Más información sobre la lista de distribución Lazarus-es