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

Alfonso Arias Lemas alfonsoariaslemas en gmail.com
Mie Mayo 9 12:01:06 CEST 2018


Hola Jesus.

Optimo, más un procedimiento que me sirve para lo que quería, que era poder guardar ficheros binarios en bases de datos. Yo había resuelto haciendo la conversión a BASE64 pero así pudiera ser mejor ya que no aumenta de tamaño la transferencia como en BASE64.

Mil gracias.

   Alfonso

 

 

De: Lazarus-es [mailto:lazarus-es-bounces en lists.lazarus-ide.org] Em nome de Jesus Reyes A. via Lazarus-es
Enviada: 8 de maio de 2018 22:24
Para: Spanish version of Lazarus List
Cc: Jesus Reyes A.
Assunto: Re: [Lazarus-es] Gravar imagen en capo Bytea de PostgreSQL.

 

 En Fri, 27 Apr 2018 07:07:16 -0500, Alfonso Arias Lemas via Lazarus-es < <mailto:lazarus-es en lists.lazarus-ide.org> 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/20180509/f7330f6b/attachment.html>


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