Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 09-11-2009
Lizette Lizette is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Lizette Va por buen camino
Guardar y recuperar imagen en bd

Hola compañeros, trato de guardar una imagen en mi bd pero lo que hago es guardarla como string, escribiendola en un flujo Stream, de alli para recuperarla leo el campo y lo escribo en un flujo stream y de allí cargo la imagen. El problema esk no me muestra ninguna imagen , alguien me pudiera orientar, o bien sugerir otra forma de hacerlo.

Código Delphi [-]
//Para guardar la imagen
foto := TStringStream.Create('');
   Image3.Picture.Graphic.SaveToStream(foto);

   ADOtblCte.FieldByName('FotoC').AsString:=foto.DataString;

Código Delphi [-]
//Para mostrar la imagen
var
imagen:TStringStream;
cargar:TBitMap;
begin
 imagen := TStringStream.Create('');
 ADOTable1.Open;
 imagen.WriteString(ADOTable1.FieldValues['FotoC']);
 cargar:=TBitMap.Create;
 cargar.LoadFromStream(imagen);
 image1.Picture.Graphic:=cargar;
 ADOTable1.Close;
end;

Saludos y gracias
Responder Con Cita
  #2  
Antiguo 12-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question

Disculpa mi ignorancia ,pero dices que la imagen lo guardas como string? ¿como es eso? Talves te estas refiriendo a solo guardar la ruta de la imagen?
Y aparte de eso ¿Que servidor de base de datos usas(MySQL,MS SQL Server,Oracle,Firebird,etc)?¿Y que tipo de dato es la columna de tu tabla que guarda la imagen (Char,Varchar,Blob,etc)?.

Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #3  
Antiguo 13-11-2009
Lizette Lizette is offline
Miembro
 
Registrado: jun 2008
Posts: 98
Poder: 16
Lizette Va por buen camino
Uff, perdón, se me olvido comentar que el motor de bd que utilizo es MySql, y el campo es varchar.

Ese código lo saqué de un post de la web del programador, que supuestamente guarda la imagen como texto, pero ya vi q nomás no funciona jeje. Saludos
Responder Con Cita
  #4  
Antiguo 18-11-2009
Alzheimer Alzheimer is offline
Miembro
 
Registrado: mar 2009
Posts: 16
Poder: 0
Alzheimer Va por buen camino
pk no usas un kampo de tipo Graphic *son para esto* y te ahorras todo eso de konvertir en string una imagen k parece k no funciona????
Responder Con Cita
  #5  
Antiguo 18-11-2009
calogero calogero is offline
Miembro
 
Registrado: oct 2006
Ubicación: Los Mochis, Sinaloa, México
Posts: 76
Poder: 18
calogero Va por buen camino
Hola en casos como ese lo que yo hago es solo guardar la ruta en la base de datos y la imagen la guardo en una carpeta en el disco duro asi solo leo la ruta en la base de datos y la imagen la tomo de la carpeta del disco duro, tal vez no sea la mejor forma pero me ha funcionado yo desarrollo aplicaciones web en php y esa es la manera en la que guardo imágenes.

saludos..
__________________
La conquista mas grande de un hombre es la conquista de el mismo.
Responder Con Cita
  #6  
Antiguo 18-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por calogero Ver Mensaje
Hola en casos como ese lo que yo hago es solo guardar la ruta en la base de datos y la imagen la guardo en una carpeta en el disco duro asi solo leo la ruta en la base de datos y la imagen la tomo de la carpeta del disco duro, tal vez no sea la mejor forma pero me ha funcionado yo desarrollo aplicaciones web en php y esa es la manera en la que guardo imágenes.

saludos..
Es verdad es una buena solucion, personalmente tambien he implementado algo asi, pero tiene un inconveniente que si la aplicacion es multiusuario y se encuentra en diferentes Maquinas, pues no se va poder ver las imagenes en todas y peor aun si la aplicacion se conecta desde una red Wan.
Por otro lado tambien si se guarda muchas imagenes directamente en las tablas del servidor, puede provocar lentitud o sobrecarga en la red.
Asi que en todo caso hay que ver la forma mas adecuada posible de implementarlo y eso depende de la aplicacion, y de quien lo esta implementado.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7

Última edición por rgstuamigo fecha: 18-11-2009 a las 17:20:10.
Responder Con Cita
  #7  
Antiguo 18-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Alzheimer Ver Mensaje
pk no usas un kampo de tipo Graphic *son para esto* y te ahorras todo eso de konvertir en string una imagen k parece k no funciona????
Los campos Graphic son exclusivos de Paradox, no sé de otra base que los tenga, no al menos MySQL. De hecho, este tipo de campo sirve exclusivamente para bitmaps y no para otros formatos como jpg o png.

Cita:
Empezado por rgstuamigo Ver Mensaje
Es verdad es una buena solucion, personalmente tambien he implementado algo asi, pero tiene un inconveniente que si la aplicacion es multiusuario y se encuentra en diferentes Maquinas, pues no se va poder ver las imagenes en todas y peor aun si la aplicacion se conecta desde una red Wan.
No entiendo esto. Las imágenes se guardarían en algún direcorio del servidor, así que podrían accederse desde cualquier parte.

Cita:
Empezado por rgstuamigo Ver Mensaje
Por otro lado tambien si se guarda muchas imagenes directamente en las tablas del servidor, puede provocar lentitud o sobrecarga en la red.
Yo creo que esto sucedería sólo si se selecciona el campo de la foto para cada consulta en lugar de descargarla sólo en los registros deseados.

// Saludos
Responder Con Cita
  #8  
Antiguo 18-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Lizette,

No sé si pueda guardarse una imagen en un campo de tipo VarChar, en todo caso, no me parece el más indicado. Sería mejor que optaras por un campo BLOB (LongBlob, MediumBlob, TinyBlob, etc., dependiendo del tamaño de tus imágenes).

Te pongo aquí unas rutinas para guardar y mostrar imágens en una base MySQL usando un ADOTable:

Código Delphi [-]
// Guardar una imagen
var
    Stream: TStringStream;

begin
    Stream := TStringStream.Create('');

    try
        Image1.Picture.Graphic.SaveToStream(Stream);

        AdoTable1.Append;
        AdoTable1.FieldByName('titulo').AsString := 'Mi primera foto';
        AdoTable1.FieldByName('foto').AsString := Stream.DataString;
        AdoTable1.Post;
    finally
        Stream.Free;
    end;
end;

// Mostrar la imagen
var
    Stream: TStringStream;
    Bitmap: TBitmap;

begin
    Bitmap := nil;
    Stream := nil;

    try
        Bitmap := TBitmap.Create;
        Stream := TStringStream.Create(AdoTable1.FieldByName('foto').AsString);

        Bitmap.LoadFromStream(Stream);
        Image1.Picture.Assign(Bitmap);
    finally
        Bitmap.Free;
        Stream.Free;
    end;
end;

Las rutinas equivalentes usando un AdoQuery

Código Delphi [-]
// Guardar una imagen
var
    Stream: TStringStream;

begin
    Stream := TStringStream.Create('');
    try
        Image1.Picture.Graphic.SaveToStream(Stream);

        AdoQuery1.SQL.Text := 'insert into fotos (titulo, foto) values(:titulo, :foto)';
        AdoQuery1.Parameters.ParamByName('titulo').Value := 'Mi primera foto';
        AdoQuery1.Parameters.ParamByName('foto').Value := Stream.DataString;
        AdoQuery1.ExecSQL;
    finally
        Stream.Free;
    end;
end;

// Mostrar la imagen
var
    Stream: TStringStream;
    Bitmap: TBitmap;

begin
    Bitmap := nil;
    Stream := nil;

    try
        Bitmap := TBitmap.Create;

        AdoQuery1.SQL.Text := 'select titulo, foto from fotos where id = :id';
        AdoQuery1.Parameters.ParamByName('id').Value := 8;
        AdoQuery1.Open;

        Stream := TStringStream.Create(AdoQuery1.FieldByName('foto').AsString);

        Bitmap.LoadFromStream(Stream);
        Image1.Picture.Assign(Bitmap);
    finally
        Bitmap.Free;
        Stream.Free;
    end;
end;

Veo más conveniente usar un AdoQuery, sobre todo para obtener la imagen desde la base de datos; porque usar un AdoTable implicaría, como dice rgstuamigo, demasiado tráfico. Lo normal sería, mostrar una lista de registros y que el usuario escoja de cual quiere ver la imagen, y sólo entonces descargas la foto.

// Saludos
Responder Con Cita
  #9  
Antiguo 18-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow

Cita:
Empezado por roman Ver Mensaje
No entiendo esto. Las imágenes se guardarían en algún direcorio del servidor, así que podrían accederse desde cualquier parte.
Hahh bueno..asi pues si...,pero alo que me refiriendo yo en ese comentario es a que cada usuario guarde las imagenes en su propio ordenador, esto para evitar estar trayendo o llevando imagenes por la red.
Cita:
Empezado por roman Ver Mensaje
Yo creo que esto sucedería sólo si se selecciona el campo de la foto para cada consulta en lugar de descargarla sólo en los registros deseados.
ok.. Pero dime de manera lo traerias las fotos en una cosulta SQL del servidor si lo tienes en un dterminado directorio?
¿Y como le enviarias las imagenes a dicho directorio?
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #10  
Antiguo 18-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
¿Guardar las imagenes en cada ordenador? Pues entonces se pierde el concepto de una base de datos ¿no?

En cuanto a lo segundo, creo que estás confundiendo. Es decir, en la parte del comentario que citas, yo me estoy refiriendo a cuando se guardan las fotos en un campo BLOB, no en archivos separados.

Si uno enlaza un AdoTable a una tabla con imágenes, seguramente habrá mucho tráfico pues se estarían descargando fotos que no necesariamente se desea ver. Por eso le comento a Lizette que sería mejor una consulta SQL.

Ahora, en cuanto a guardar las imágenes en archivos separados, no creo que con consultas SQL puedan subirse o bajarse las fotos. Pero se tendría la ruta del servidor en donde se almacenan y ya sería cuestión de usar FTP o HTTP (con Indy, por ejemplo) para moverlas de un sitio a otro.

// Saludos
Responder Con Cita
  #11  
Antiguo 18-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question

Cita:
Empezado por roman Ver Mensaje
¿Guardar las imagenes en cada ordenador? Pues entonces se pierde el concepto de una base de datos ¿no?
No es que se pierda el concepto..sino que a veces no es necesario guardar todo en el servidor (depende del caso)si por ejemplo tengo un solo usuario,por eso explique aqui claramente que eso depende de la aplicacion que se pretender hacer.
Cita:
Empezado por roman Ver Mensaje
Ahora, en cuanto a guardar las imágenes en archivos separados, no creo que con consultas SQL puedan subirse o bajarse las fotos. Pero se tendría la ruta del servidor en donde se almacenan y ya sería cuestión de usar FTP o HTTP (con Indy, por ejemplo) para moverlas de un sitio a otro.
Creo que estariamos complicando la cosa. ¿no te parece?
Te pregunto: ¿entonces que ventaja tengo o obtengo de guardar la imagenes en un directorio del servidor? Para eso mas bien guardarlas en la base de dato, que me permite verlas desde cualquier lugar y sin usar FTP o HTTP.¿O hay algo que no estoy tomando en cuenta?
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #12  
Antiguo 18-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo
No es que se pierda el concepto..sino que a veces no es necesario guardar todo en el servidor (depende del caso)si por ejemplo tengo un solo usuario
A ver, tú comentaste:

Cita:
Empezado por rgstuamigo
Es verdad es una buena solucion, personalmente tambien he implementado algo asi, pero tiene un inconveniente que si la aplicacion es multiusuario y se encuentra en diferentes Maquinas, pues no se va poder ver las imagenes en todas y peor aun si la aplicacion se conecta desde una red Wan.
Y ahora mencionas una aplicación monousuario. Pero, aún siendo un sólo usuario trabajando en distintas máquinas; o hay un servidor central o tiene que estar portando los datos de un lado a otro. En el primer caso, no tendría mucho sentido guardar las imágenes localmente, pues justamente se pierde el sentido de una base de datos centralizada. En el segundo caso, si de todas formas debe transportar los datos, pues ya lo mismo da transportar las fotos.

Ahora, en cuanto a si se complican las cosas, pues sí se complican. Pero yo no fui quien propuso guardar las fotos en archivos separados Los campos BLOB de una base están para algo.

Por otra parte, en caso de que fuese necesario lo de los archivos aparte, tampoco es que sea una tarea gigantezca el transportarlas via FTP o HTTP. Pero, además, si te fijas, calogero -quien fue el que mencionó lo de guardar las imágenes en archivos- trabaja con php en web, lo cual ofrece otro panorama, pues es el mismo php corriendo en el servidor quien se encargaría de leer las fotos y mandarlas al navegador sin necesidad del extra de algo como las Indy.

// Saludos
Responder Con Cita
  #13  
Antiguo 18-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Question

Cita:
Empezado por roman Ver Mensaje
...
Y ahora mencionas una aplicación monousuario. Pero, aún siendo un sólo usuario trabajando en distintas máquinas; o hay un servidor central o tiene que estar portando los datos de un lado a otro. En el primer caso, no tendría mucho sentido guardar las imágenes localmente, pues justamente se pierde el sentido de una base de datos centralizada. En el segundo caso, si de todas formas debe transportar los datos, pues ya lo mismo da transportar las fotos.
...
Eso lo puse por ejemplo y entiendo lo que tratas decir pero te recalco, amigo roman, que a veces es el tipo de aplicacion(Como se va usar, es grande o chica, que se va guardar,etc) que definira la forma de trabajo.
Cita:
Empezado por roman Ver Mensaje
Ahora, en cuanto a si se complican las cosas, pues sí se complican. Pero yo no fui quien propuso guardar las fotos en archivos separados Los campos BLOB de una base están para algo.
Pues ..en el post nro 7 tú mismo dijiste que las imagenes se guardaran en algun directorio en el Servidor.
Cita:
Empezado por roman Ver Mensaje
Por otra parte, en caso de que fuese necesario lo de los archivos aparte, tampoco es que sea una tarea gigantezca el transportarlas via FTP o HTTP.
...
Bueno... pero dime que Ventajas consigo con eso?
¿acaso no seria mejor ,en ese caso, guardarlo directamente en la base de dato?
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #14  
Antiguo 18-11-2009
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por rgstuamigo Ver Mensaje
a veces es el tipo de aplicacion(Como se va usar, es grande o chica, que se va guardar,etc) que definira la forma de trabajo.
Pues claro. Pero dicho así, es algo muy ambiguo, y no sé cómo aplicaría en este caso. Y el ejemplo que pusiste para clarificar cambió de un post a otro...

Cita:
Empezado por rgstuamigo Ver Mensaje
Pues ..en el post nro 7 tú mismo dijiste que las imagenes se guardaran en algun directorio en el Servidor.
Claro, dije eso, pero sólo como respuesta a tu comentario en cuanto a la desventaja del método. Argumenté el porqué no es una desventaja. Pero eso no significa que yo haya propuesto esa técnica.

Cita:
Empezado por rgstuamigo Ver Mensaje
Bueno... pero dime que Ventajas consigo con eso?
¿acaso no seria mejor ,en ese caso, guardarlo directamente en la base de dato?
Saludos...
Repito lo dicho. No es mi propuesta, así que no soy el mejor para argumentar sus ventajas.

// Saludos
Responder Con Cita
  #15  
Antiguo 18-11-2009
Avatar de rgstuamigo
rgstuamigo rgstuamigo is offline
Miembro
 
Registrado: jul 2008
Ubicación: Santa Cruz de la Sierra-Bolivia
Posts: 1.646
Poder: 17
rgstuamigo Va por buen camino
Arrow Aclarado

Todo Aclarado amigo.
Saludos...
__________________
"Pedid, y se os dará; buscad, y hallaréis; llamad, y se os abrirá." Mt.7:7
Responder Con Cita
  #16  
Antiguo 19-11-2009
Mystery Mystery is offline
Miembro
 
Registrado: jul 2007
Ubicación: Santiago de Cuba
Posts: 69
Poder: 17
Mystery Va por buen camino
Guardar IMG

hola a todos bueno aclaro que yo nunca he usado el MySQL para hacer esto pero supongo que usando los tipos de campo que aclara roman debe ser lo mismo....
yo para guardar imagenes en una base de datos uso lo TMemoryStream.
algo como esto...
Código Delphi [-]
var
  Stream:TMemoryStream;
begin   
   Stream:=TMemoryStream.Create;   
   try
     Stream.LoadFromFile('C:\myImg.jpg');
     Stream.Seek(0, soFromBeginning);       
     TipocampoBlob.LoadFromStream(stream);
   finally
     Stream.Free;
   end;
end;
con eso resuelvo... y hasta ahora guardo imagenes de todos tipos sin ningun tipo de problemas usando SQL Server.. Access.....

bueno.....

chaoooo
Responder Con Cita
  #17  
Antiguo 24-11-2009
Avatar de JULIPO
JULIPO JULIPO is offline
Miembro
 
Registrado: ene 2006
Ubicación: Bogota Colombia
Posts: 187
Poder: 19
JULIPO Va por buen camino
Me aparece un error

Reciban un cordial saludo.

estoy en en mismo problema resulta que yo utilizo zeos y Mysql con delphi 2007 las fotos que debo almacenar en mysql estan en jpeg hago el mismo procedimiento que indica roman cambiando unicamente el tbitmap por un Tjpegimage y me aparece el error jpeg error #53 me almacena mal los datos como lo soluciono.
__________________
No basta con saber es necesario aplicar lo que se sabe, no basta con querer hacer las cosas es necesario hacerlas
Goethe
Responder Con Cita
  #18  
Antiguo 26-11-2009
Avatar de JULIPO
JULIPO JULIPO is offline
Miembro
 
Registrado: ene 2006
Ubicación: Bogota Colombia
Posts: 187
Poder: 19
JULIPO Va por buen camino
Encontre mi solucion

Resulta que tengo un disparador en el evento ondatachange en el data source para que me almacene los datos correctamente debo desabilitar ese datasource mientras se almacenan los datos y luego lo activo queda perfecto.
__________________
No basta con saber es necesario aplicar lo que se sabe, no basta con querer hacer las cosas es necesario hacerlas
Goethe
Responder Con Cita
Respuesta



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
SQL Server - Grabar / Recuperar Imagen _Willa MS SQL Server 1 17-12-2008 13:37:30
Recuperar IMAGEN de un QUERY natalinuyo Gráficos 31 12-02-2007 23:22:22
Guardar/Recuperar OLEVARIANT OF ARRAY (II) Franz Argandoña Tablas planas 2 13-07-2006 20:42:59
Guardar y recuperar noipa Varios 3 07-02-2006 14:46:21
Cargar y recuperar imagen en bd MySQL??? burasu MySQL 2 22-08-2004 22:40:18


La franja horaria es GMT +2. Ahora son las 13:59:37.


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