Sign in Join

Live chat for Free Pascal, Lazarus, Delphi and every Pascal programmer.

Mailing lists / lazarus-es / 2018-04

Gravar imagen en capo Bytea de PostgreSQL.

3 messages · 2 people · –

Reply by email Subscribe to this list Your subscription

Read-only archive. Use j and k to move between messages.

Alfonso Arias Lemas

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

------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://lists.lazarus-ide.org/pipermail/lazarus-es/attachments/20180427/62b4b702/attachment.html>

Reply by email

Jesus Reyes A.
to Alfonso Arias Lemas

En Fri, 27 Apr 2018 07:07:16 -0500, Alfonso Arias Lemas via Lazarus-es

<lazarus-es en lists.lazarus-ide.org> wrote 23 lines
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>

Reply by email

Alfonso Arias Lemas
to Jesus Reyes A.

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>

Reply by email