Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 30-01-2009
seara2005 seara2005 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Colombia
Posts: 63
Poder: 21
seara2005 Va por buen camino
Imagenes en Firebird

Utilizo Delphi 2007 y Firebird 2.1.
Lo que necesito de ustedes es mas bien una recomendación:
Estoy diseñando una aplicación relacionada con el control de personal, el tema es que el cliente ha solicitado que entre toda la información esté contenida la foto de cada trabajador. Mi consulta es la siguiente:
Que me recomiendan?
- Crear un campo e incluir las imágenes en la tabla del resto de las informaciones.
- Crear una tabla independiente con solo las imágenes y un campo llave.
- Guardar las imágenes en archivos independientes en una carpeta.
- Otra?...
Las imagenes serían siempre fotos tipo cédula, o sea pequeñas y podría limitar el tamaño máximo a cargar a la base de datos a 20 k por ejemplo.
Si alguien tiene experiencia con este tema le agradecería que me ayudara.
__________________
Saludos

Seara2005
Responder Con Cita
  #2  
Antiguo 31-01-2009
Avatar de Luis M.
[Luis M.] Luis M. is offline
Miembro Premium
 
Registrado: sep 2004
Ubicación: Ripollet - Barcelona
Posts: 212
Poder: 20
Luis M. Va por buen camino
Hola.
¿Cuantos registros (trabajadores) se va a incluir en la tabla?
Responder Con Cita
  #3  
Antiguo 02-02-2009
seara2005 seara2005 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Colombia
Posts: 63
Poder: 21
seara2005 Va por buen camino
gracias por interesarse
En la tabla inicialmente podrán existir unos 2000 (Dos mil trabajadores), pero con el tiempo podrán incrementarse progresivamente ya que se desea mantener la información de los que se den de baja por diversas causas y se irán incrementándo las altas.
__________________
Saludos

Seara2005
Responder Con Cita
  #4  
Antiguo 02-02-2009
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
A mi me parece que en estos casos, es mejor guardar estas imagenes en el sistema de archivos del SO y no en la base de datos...

Si necesitamos llamar esa información desde la web o algo por el estilo, solo sería cuestión de utilizar el método adecuado para estos casos, (Por ejemplo, un componente de PHP o ASP .NET (O lo que sea), que cargue una imagen desde el sistema de archivos, pasándole la información desde un registro que guarda dicha "ruta de la imagen" en la base de datos).

Así, nos evitamos lentitud en el Backup/Restore, que posibles daños (Que son pocos, pero posibles) en la base de datos no nos permita la recuperación de todas esas imagenes, que haya mucho crecimiento del tamaño "físico" en nuestra BD y en fin, muchas cosas mas, que en este momento no se me ocurren, pero que deben existir.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #5  
Antiguo 02-02-2009
Avatar de ArdiIIa
[ArdiIIa] ArdiIIa is offline
Miembro Premium
 
Registrado: nov 2003
Ubicación: Valencia city
Posts: 1.481
Poder: 22
ArdiIIa Va por buen camino
Pues siento discrepar jhonny, pero yo personalmente no veo ningún inconveniente ni desventaja a la hora de tratar las imágenes en una BD.
Yo nunca encontré problema alguno con las BD que llevan imágenes. Se aprovecha la gran ventaja de firebird de tener toda la información compactada en un "solo fichero" (si es el caso), y no tienes archivos "perdidos" en carpetas.
A la hora de un Backup/Restore, supongo que también habría que hacerlo con los ficheros contenidos en una carpeta.
En cuanto al tamaño de la BD, ya se habló mucho de las cantidades y límites soportadas por Firebird que consecuentemente serían las del propio sistema que soporte a Firebird.
Tampoco veo ningún problema para "procesar" las imágenes a la hora de que estas fueran proyectadas vía web.....

En fin, llevo muchas BD con imágenes y nunca he tenido problemas cuando estas son tratadas... por lo cual apoyo ese sistema.

Cita:
- Crear una tabla independiente con solo las imágenes y un campo llave.
Esta me parece buena alternativa, de este modo la table que contiene los datos podría ir mas ágil y solamente mostraría la imagen cuando realmente fuera necesario.
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO
Responder Con Cita
  #6  
Antiguo 02-02-2009
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Crear una tabla indendiente con imágenes es algo que he hecho para aumentar el rendimiento en las consultas, que la mayor parte de las veces no necesitan las imágenes.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #7  
Antiguo 02-02-2009
Avatar de jhonny
jhonny jhonny is offline
Jhonny Suárez
 
Registrado: may 2003
Ubicación: Colombia
Posts: 7.058
Poder: 29
jhonny Va camino a la famajhonny Va camino a la fama
Desde luego que guardar imagenes en la base de datos directamente, también tiene sus ventajas, tal vez en este caso (El de guardar archivos multimedia en una BD), soy mas paranoico, la capacidad de Firebird para guardar y manipular mucha información no la pongo en duda, pero dejar todo en un solo archivo, me causa algo de desconfianza... aunque bueno, en ultimas, todos los datos de la compañía siempre están en un solo archivo... no se, en lo personal y teniendo en cuenta sus comentarios, tal vez pueda cambiar de opinión, luego de hacer mas pruebas con respecto a este tema.
__________________
Lecciones de mi Madre. Tema: modificación del comportamiento, "Pará de actuar como tu padre!"

http://www.purodelphi.com/
http://www.nosolodelphi.com/
Responder Con Cita
  #8  
Antiguo 02-02-2009
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 18
Kipow Va por buen camino
Yo lo hago actualmente a nivel del S.O. por ejemplo tengo clientes que tienen un aprox de 20,000 articulos cada uno con 1 o mas fotos, digamos que su tamaño promedio rondara los 15KB creo que seria demasiada info para cargarla a la base actual y esto implicaria demasiada info a la hora de un backup/restore incluso pesado para las consultas ( a menos que lo hiciera como sugiere marcos que no me suena muy bien la opcion de guardarlo en otra tabla). yo me decantaria con hacerlo dentro de la base ya con la version 2.5 que me permitira leer informacion de otras bases de datos desde mis procedimientos y trigguers. por el momento voto por hacerlo afuera.
Responder Con Cita
  #9  
Antiguo 03-02-2009
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Yo lo hago en una Bd (pero independiente), por varios motivos:
1. El principal y más molesto, evitar lidiar con versiones de Windos XX Home.
2. El mal rendimiento al hacer copia de seguridad de muchos archivos (mil, 15 mil 200 mil imágenes copian más rápido en un solo archivo que una a una en sus debidas carpetas).
3. integridad referencial (o emularla), es más fácil controlarla desde la bd que por archivos.
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #10  
Antiguo 03-02-2009
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Y la mejor solución que podría existir es que Firebird tuviera una opción algo así como LoadBlobFromFile, de forma tal que en un query yo pudiera hacer algo como:

Código SQL [-]
   select t.nombre, t.telefono, loadBlobFromFile(t.rutaImagen) from tabla t

Ahí verán si creamos una UDF que haca eso... (aunque siempre me quedo en el punto de como cargar el campo blob sin usar ni DBX, IBX ni ningún componente que requiera una DLL)
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #11  
Antiguo 03-02-2009
Avatar de Kipow
Kipow Kipow is offline
Miembro
 
Registrado: abr 2006
Ubicación: Guatemala
Posts: 329
Poder: 18
Kipow Va por buen camino
Y como haria generar una instruccion asi:

Código SQL [-]
insert into table (campo1, campoblob, campo3)
values (..............)

prefiero no liarme con los blob.
Responder Con Cita
  #12  
Antiguo 03-02-2009
seara2005 seara2005 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Colombia
Posts: 63
Poder: 21
seara2005 Va por buen camino
Gracias a todos por sus comentarios
Después de leer sus opiniones he decidido probar con la segunda variante

- Crear una tabla independiente con solo las imágenes y un campo llave.

Incluir las imágenes en la tabla porque como bien dice RonPablo me parece que: 1) Trabajar con tantos archivos independientes (2000 o 4000 0 xxx) parece ser mucho mas complicado y habria que trabajar bien claro con el tema de definir nombres de archivos secuenciales, etc... 2) El tema de la integridad referencial de la base de datos se pierde o se hace casi nulo al no poder controlar que no se pierdan archivos independientes. 3) La creación de Copias de seguridad de tantos archivos debe ser mas molesto de tratar y debe tener menos rendimiento. 4) Se aprovecha la ventaja de Firebird de que toda la información esté incluida en un solo archivo (como dice Ardilla), esto facilita la distribución y traslado del sistema. 5) Como las imágenes son solo fotos tipo cédula ya he realizado pruebas y se puede limitar su tamaño máximo a 5 Kb lo que permitiria que no creciera tan aceleradamente el tamaño de archivo.
Crear una tabla independiente dentro de la base de datos para la imágenes con un campo llave ya que en la mayoría de las consultas no será necesario trabajar con las imágenes lo que hace mas eficiente al sistema.

De todas formas voy a simular una base de datos con 4 o 6 mil trabajadores para realizar pruebas de rendimiento antes de hacer el sistema real.
__________________
Saludos

Seara2005
Responder Con Cita
  #13  
Antiguo 03-02-2009
Avatar de RONPABLO
[RONPABLO] RONPABLO is offline
Miembro Premium
 
Registrado: oct 2004
Posts: 1.514
Poder: 21
RONPABLO Va por buen camino
Cita:
Empezado por Kipow Ver Mensaje
Y como haria generar una instruccion asi:

Código SQL [-]insert into table (campo1, campoblob, campo3) values (..............)


prefiero no liarme con los blob.
Yo todos los datos siempre los paso por medio de parámetros...
Código Delphi [-]
   QConBlob.SQL.add('insert into table (campo1, campoblob, campo3) '
                                 + 'values (:campo1,:campo2,:campo3)';

Y después es darle el tratamiento de tipo Blob que ahora no recuerdo como es por eso no lo pongo
__________________
"Como pasa el tiempo..... ayer se escribe sin H y hoy con H"
Responder Con Cita
  #14  
Antiguo 04-02-2009
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.037
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Nuestra gestión comercial almacena las imágenes en la base de datos, en una tabla específica para ello. Esta base de datos es accesible por internet en tiempo real para todos los clientes/usuarios/curiosos. Cualquiera puede consultar los artículos, ver sus fotos, descripciones, precios, stock, etc y hacer sus pedidos por internet, repito, en tiempo real y conectados a la base de datos de la empresa.
Varios de nuestros clientes tienen bases de datos que hace tiempo pasaron de los 10 Gb y algunos están ya rondando los 20 Gb.
Además de las imágenes de los artículos también almacena documentos de todo tipo ya sean escaneados o no. Por si fuese poco, también las firmas de los clientes, por cada venta, se leen con un escaner de firmas.
De momento, hasta ahora, el único inconveniente es que hacer el backup tarda más y ocupa más que si no tuviera las imágenes, aunque da igual, se hacen automáticamente por las noches y sin detener el sistema porque con Firebird se puede crear un backup aunque estén trabajando otros usuarios.
Los clientes hacen los pedidos por internet en tiempo real porque el servidor web está conectado a la base de datos del servidor principal, o sea, trabajan realmente con la base de datos de la empresa creando sus pedidos.
El único cuello de botella es el ancho de banda de internet, la subida, que aquí en España es muy baja a no ser que pagues una fortuna cada mes para que te den un poco de más velocidad.
Responder Con Cita
  #15  
Antiguo 14-02-2009
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 18
Nasca Va por buen camino
Cita:
Empezado por RONPABLO Ver Mensaje
Y la mejor solución que podría existir es que Firebird tuviera una opción algo así como LoadBlobFromFile, de forma tal que en un query yo pudiera hacer algo como:

Código SQL [-]
   select t.nombre, t.telefono, loadBlobFromFile(t.rutaImagen) from tabla t

Ahí verán si creamos una UDF que haca eso... (aunque siempre me quedo en el punto de como cargar el campo blob sin usar ni DBX, IBX ni ningún componente que requiera una DLL)
Yo tengo una base de datos que carga los faxes recibidos desde hilafax (a través de un scripts php para consola) para que sean procesados por un faxmaster. El caso es que después de años recibiendo faxes, la base de datos ya pesa un poco, por eso consideré una opción como la tuya para no tener que lidiar con los permisos en un servidor samba y los problemas que eso conllevaría a la hora de una conexión remota, ya que antes usaba zebedee, aunque ahora me he pasado a terminal server por rendimiento.

Mi ventaja es que solo necesitaría cargar una imagen por vez. El problema que mas me preocupa es el tema de la seguridad. No obstante la UDF rFunc tiene algunas funciones que pueden servir como guía:
http://rfunc.sourceforge.net/rfunc.htm

En la sección de funciones "File". Otra opción podría ser codificar en la función UDF el fichero con alguna codificación MIME y cargar un string (comprimido??) que podríamos decodificar en el cliente.

Por cierto, como complemento a esto y para evitar el acceso directo a disco con sentencias SQL, he pensado que lo mejor sería un script que haga limpieza de los archivos una vez borrados en la base de datos la información que los complementa.

De todas formas este sistema solo tiene sentido cuando no hay interacción del usuario a la hora de cargar archivos, todo está automatizado, y el usuario solo los procesa añadiendo información. El tema se complica en los casos mas comunes en que el usuario deba crear y gestionar los archivos de forma directa. En este caso en la mayoría de las ocasiones, sobre todo cuando hay mucha diversidad en el dato/s a guardar) he optado por una ruta automática: "CAMINO"+"CLAVE del REGISTRO" sobre un servidor de archivos.
Responder Con Cita
  #16  
Antiguo 15-02-2009
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 18
Nasca Va por buen camino
Y usar scp, sftp

Después de descubrir que OpenERP usa ftp para su soporte documental he estado pensando que, si optamos por almacenar los ficheros de forma externa a la base de datos, una opción interesante a los servidores de archivos (SMB, NFS, ...) sería usar el protocolo sftp o scp. Esto permitiría abrir a internet nuestros archivos con algo mas de seguridad que usando los otros protocolos.
Una opción rápida podría ser usar un programa como WinSCP como opción al explorador de windows. Sería cuestión de descubrir si tiene alguna forma de "relacionarse" con él.

¿Alguna experiencia al respecto?
Responder Con Cita
  #17  
Antiguo 15-02-2009
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 18
Nasca Va por buen camino
Por cierto WinSCP está programado en Borland C++ Builder 6 Professional y tiene disponible el código fuente.
Responder Con Cita
  #18  
Antiguo 17-11-2009
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 293
Poder: 18
GustavoCruz Va por buen camino
Unhappy

Hola amigos de foro, mi preguntas es cuál es la instrucción para insertar una imagen.

no deseo utilizar el componente DBImage, porque solamente me inserta imagenes BMP...

También me gustaria saber cómo recupero la imagen de la base de datos...

de antemano muchas gracias por vuestro tiempo


Gustavo Cruz
Responder Con Cita
  #19  
Antiguo 17-11-2009
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 20
fidel Va por buen camino
Con ese tamaño de foto y de base de datos por qué no en la base de datos.

http://www.clubdelphi.com/foros/showthread.php?t=41572
Responder Con Cita
  #20  
Antiguo 17-11-2009
seara2005 seara2005 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Colombia
Posts: 63
Poder: 21
seara2005 Va por buen camino
En este caso no se utiliza otro campo para el formato.

Para probar en un Formulario (Form1) pones:
Un TOpenPictureDialog y lo nombras OpenPictureDialog,
Un TButton y Lo Nombras ButtonCargarImagen,
Un TButton y lo Nombras MostrarImagen,
Un TButton y lo Nombras BorrarImagen,
Un TImage y lo Nombras ImageFoto,
Además en DataModule1 existe una tabla de InterBase IBTPersonas con un campo tipo Blob llamado Foto (Enlazada a la correspondiente base de datos).
Tambien puedes poner un DbGrid enlazado a la Tabla mediante el DataSource correspondiente para seleccionar el registro con que quieras experimentar.

Adicionar en el Uses JPEG

Para cargar la Imagen (bmp, jpg, ico) con el diálogo directamente a la base de datos:
Código Delphi [-]
procedure TForm1.ButtonCargarImagenClick(Sender: TObject);
var
  Jpg: TJpegImage;
  Stream: TMemoryStream;
  FileExt: string;
  GraphType: TGraphType;
begin
  if OpenPictureDialog.Execute then
     begin
      Jpg := nil;
      Stream := nil;
      try
        Stream := TMemoryStream.Create;
        FileExt := LowerCase(ExtractFileExt(OpenPictureDialog.FileName));
        if (FileExt = '.bmp') or (FileExt = '.dib') then 
          begin
             GraphType := gtBitmap;
             Stream.Write(GraphType, 1);
             with ImageFoto.Picture.Bitmap do 
                begin
                   LoadFromFile(OpenPictureDialog.FileName);
                   ImageFoto.Picture.Bitmap.SaveToStream(Stream);
                end;
          end 
          else if (FileExt = '.ico') then 
                begin
                   GraphType := gtIcon;
                   Stream.Write(GraphType, 1);
                   with ImageFoto.Picture.Icon do 
                      begin
                         LoadFromFile(OpenPictureDialog.FileName);
                         ImageFoto.Picture.Bitmap.SaveToStream(Stream);
                      end;
                end 
          else if (FileExt = '.emf') or (FileExt = '.wmf') then 
                begin
                   GraphType := gtMetafile;
                   Stream.Write(GraphType, 1);
                   with ImageFoto.Picture.Metafile do 
                      begin
                         LoadFromFile(OpenPictureDialog.FileName);
                         ImageFoto.Picture.Bitmap.SaveToStream(Stream);
                      end;
                end 
          else if (FileExt = '.jpg') or (FileExt = '.jpeg') or (FileExt = '.jpe') then 
                begin
                   Jpg := TJpegImage.Create;
                   Jpg.LoadFromFile(OpenPictureDialog.FileName);
                   ImageFoto.Picture.Assign(Jpg);
                   GraphType := gtJpeg;
                   Stream.Write(GraphType, 1);
                   Jpg.SaveToStream(Stream);
                end;
      DataModule1.IBTPersonas.Edit;
      Stream.Position := 0;
      DataModule1.IBTPersonasFoto.LoadFromStream(Stream);
     except
      jpg.Free;
      Stream.Free;
      raise;
     end;
     jpg.Free;
     Stream.Free;
   end;
end;

Para Mostrar la Foto almacenada en la base de dastos en el TImage:
Código Delphi [-]
procedure TForm1.MostrarImagenClick(Sender: TObject);
var
  Stream: TMemoryStream;
  Jpg: TJpegImage;
  GraphType: TGraphType;
begin
  Jpg := nil;
  Stream := nil;
  try
    Stream := TMemoryStream.Create;
    DataModule1.IBTPersonasFoto.SaveToStream(Stream);
    if Stream.Size > 0 then 
       begin
          Stream.Position := 0;
          Stream.Read(GraphType, 1);
          case GraphType of
             gtBitmap:   Form1.ImageFoto.Picture.Bitmap.LoadFromStream(Stream);
             gtIcon:      Form1.ImageFoto.Picture.Icon.LoadFromStream(Stream);
             gtMetafile: Form1.ImageFoto.Picture.Metafile.LoadFromStream(Stream);
             gtJpeg:     begin
                               Jpg := TJpegImage.Create;
                               Jpg.LoadFromStream(Stream);
                               Form1.ImageFoto.Picture.Assign(Jpg);
                            end 
             else Form1.ImageFoto.Picture.Assign(nil);  // Limpiar la imagen
         end;
      end 
    else Form1.ImageFoto.Picture.Assign(nil);
  except
    Form1.ImageFoto.Picture.Assign(nil);
  end;
  jpg.Free;
  Stream.Free;
end;

Para Borrar la imagen de la base de datos:
Código Delphi [-]
procedure TForm1.BorrarImagenClick(Sender: TObject);
begin
   ImageFoto.Picture.Assign(nil);
   DataModule1.IBTPersonas.Edit;
   DataModule1.IBTPersonasFoto.Assign(nil);  // Limpiar el campo
end;
__________________
Saludos

Seara2005

Última edición por seara2005 fecha: 17-11-2009 a las 23:27:45.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Imagenes en Firebird 2 trex2000 Firebird e Interbase 1 27-12-2007 00:17:23
Firebird 1.5.3 Error:No puede ejecutarse Firebird Guardian xq ya hay una instancia Delphius Firebird e Interbase 5 26-01-2007 10:19:20
¿Que tipo de imágenes soporta firebird? Delphius Firebird e Interbase 12 13-10-2006 19:33:58
Insertar Imagenes en Firebird (y la madre que lo pario!!!) papulo Firebird e Interbase 7 23-11-2005 16:13:07
Imagenes(BLOB) Firebird con VB6 pzhero Firebird e Interbase 5 06-05-2004 15:32:45


La franja horaria es GMT +2. Ahora son las 16:18:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi