From jesusrmx en gmail.com Wed May 9 01:24:28 2018 From: jesusrmx en gmail.com (Jesus Reyes A.) Date: Tue, 08 May 2018 18:24:28 -0500 Subject: [Lazarus-es] Gravar imagen en capo Bytea de PostgreSQL. In-Reply-To: <000501d3de20$49f10b90$ddd322b0$@gmail.com> References: <000501d3de20$49f10b90$ddd322b0$@gmail.com> Message-ID: En Fri, 27 Apr 2018 07:07:16 -0500, Alfonso Arias Lemas via Lazarus-es 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: From alfonsoariaslemas en gmail.com Wed May 9 12:01:06 2018 From: alfonsoariaslemas en gmail.com (Alfonso Arias Lemas) Date: Wed, 9 May 2018 09:01:06 -0100 Subject: [Lazarus-es] Gravar imagen en capo Bytea de PostgreSQL. In-Reply-To: References: <000501d3de20$49f10b90$ddd322b0$@gmail.com> Message-ID: <002601d3e77c$a736e530$f5a4af90$@gmail.com> 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 < 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: