Club Delphi  
    Paypal   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 14-02-2009
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 20
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
  #2  
Antiguo 15-02-2009
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 20
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
  #3  
Antiguo 15-02-2009
Nasca Nasca is offline
Miembro
 
Registrado: abr 2007
Ubicación: Almería (España)
Posts: 249
Poder: 20
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
  #4  
Antiguo 17-11-2009
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 296
Poder: 20
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
  #5  
Antiguo 17-11-2009
fidel fidel is offline
Miembro
 
Registrado: mar 2005
Posts: 381
Poder: 22
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
  #6  
Antiguo 17-11-2009
seara2005 seara2005 is offline
Miembro
 
Registrado: ago 2003
Ubicación: Colombia
Posts: 63
Poder: 23
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
  #7  
Antiguo 18-11-2009
Avatar de fjcg02
[fjcg02] fjcg02 is offline
Miembro Premium
 
Registrado: dic 2003
Ubicación: Zamudio
Posts: 1.418
Poder: 24
fjcg02 Va camino a la fama
Hola,
yo tengo una tabla con la clave y la imagen. Previamente a la carga en la BBDD comprimo los archivos ( pueden ser de cualquier tipo ) ylógicamente previo a mostarlos los descompprimo en una unidad temporal.

Saludos
__________________
Cuando los grillos cantan, es que es de noche - viejo proverbio chino -
Responder Con Cita
  #8  
Antiguo 19-11-2009
Avatar de GustavoCruz
GustavoCruz GustavoCruz is offline
Miembro
 
Registrado: jul 2006
Ubicación: Sampués Sucre (Colombia)
Posts: 296
Poder: 20
GustavoCruz Va por buen camino
Hola amigos, logré insertar una foto, pero el problema que tengo ahora es que al momento de recuperar la foto de la db, me muestra un error de incompatibilidad. "incompatible cast type"

la forma en como declaro el campo es:
Código SQL [-]
campofoto blob subtype 0 segment size 80
.

le agradezco infinitamente que me puedan ayudar... y de antemano muchas gracias por vuestro tiempo...
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 14:59:27.


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