PDA

Ver la Versión Completa : No se guardan las imágenes completas en el campo LONGBLOB


oh.mely
30-05-2018, 20:58:06
Hola a todos, soy nueva aquí, verán, mi caso es el siguiente:
-Uso Delphi 7, tengo un formulario de productos en el cual necesito guardar una foto (.jpg) en un campo tipo blob en mi BD. Esto desde un TImage, antes usaba un DBImage pero me leyendo otros foros vi que este sólo me permitía guardar imágenes .bmp, en fin, ya logré que la imagen se guarde con el siguiente código:

procedure TFr_Producto.BitBtn1Click(Sender: TObject);
var
fs: TMemoryStream;
imgJPG: TJPEGImage;
begin
if dlAbrirFoto.Execute then
begin
imgJPG:= TJPEGImage.Create;
fs:= TMemoryStream.Create;
try
imgJPG.LoadFromFile(dlAbrirFoto.FileName);
imgJPG.SaveToStream(fs);
fs.Seek(0,soFromBeginning);
try
imgFoto.Picture.Assign(imgJPG);
finally
fs.Free;
end;
except
on E : Exception do
begin
MessageDlg('Asegúrese de que la imagen seleccionada es de ' +
' tipo JPEG con formato correcto. ' +
E.Message, mtError, [mbOK], 0);
end;
end;

end;

end;

Lo que ahora necesito es que al consultar el registro me aparezca la foto, pero me marca un error que dice que el formato de la foto no es correcto. lo Hago de la siguiente manera:
*Aquí consulto los datos*
procedure TFr_Producto.FormShow(Sender: TObject);
begin
Seleccion:= 'select producto.ID, CODBAR, NOMBRE, DESCRIPCION, inventario.EXISTENCIA, ';
Seleccion:=Seleccion+'FAMILIA, MARCA, FECHA_ALTA, inventario.STOCK_MAX, inventario.STOCK_MIN, ';
Seleccion:=Seleccion+' inventario.PRE_COST, inventario.PRE_BRUTO, inventario.PRE_VTA, inventario.COST_MED, IMAGEN ';
Seleccion:=Seleccion+'from producto inner join inventario ';
Seleccion:=Seleccion+'on producto.ID = inventario.IDPROD ';
Seleccion:=Seleccion+'where producto.ID = :idP';
buscar_producto(CatProductos.idProd);
end;

*Aquí los asigno al formulario*
procedure TFr_Producto.buscar_producto(idProd: Integer);

begin
Edit1.Text:= IntToStr(CatProductos.idProd);
Query:= MDatos.Query01;
Query.Close;
Query.SQL.Clear;
Query.SQL.Add(Seleccion);
Query.Params[0].AsInteger:=CatProductos.idProd;
Query.Open;

if not Query.IsEmpty then
begin
Edit1.Text:=Query.Fields[0].AsString;
Edit2.Text:=Query.Fields[1].AsString;
Edit4.Text:=Query.Fields[2].AsString;
Edit3.Text:=Query.Fields[3].AsString;
Edit8.Text:= Query.Fields[6].AsString;
Edit9.Text:= Query.Fields[5].AsString;
Fecha_Alta.Date:= Query.Fields[7].AsDateTime;
Edit7.Text:=Query.Fields[10].AsString;
Edit5.Text:=Query.Fields[13].AsString;
Edit11.Text:=Query.Fields[11].AsString;
Edit13.Text:=Query.Fields[12].AsString;
Edit14.Text:= Query.Fields[9].AsString;
Edit15.Text:= Query.Fields[8].AsString;
Edit16.Text:= Query.Fields[4].AsString;
imgFoto.Picture.Graphic.Assign(Query.Fields[14]);
end;
end;

El error me lo marca en - imgFoto.Picture.Graphic.Assign(Query.Fields[14]); -
Sé que igual y es "tonto" la manera en que le estoy asignando el valor al TImage (imgFoto) pero ya he intentado de muchas maneras y no puedo. No sé si alguien pueda ayudarme, de antemano muchas gracias y espero haber publicado en el lugar correcto.

ecfisa
30-05-2018, 22:30:13
Hola oh.mely, bienvenida a los foros de Club Delphi :)

Si el formato guardado es un .jpg válido, inténtalo de este modo:

...

uses Jpeg;

procedure TuForm.BitBtn1Click(Sender: TObject);
var
J: TJPEGImage;
begin
//...
Image1.Picture := nil;
J := TJPEGImage.Create;
try
J.Assign(TBlobField(Query.FieldByName('IMAGEN')));
imgFoto.Picture.Assign(J);
finally
J.Free;
end;
end;


Saludos :)

oh.mely
30-05-2018, 22:55:56
¡Muchísimas gracias ecfisa! si me funcionó. Gracias por el tiempo y la atención.

¡Saludos! :D

oh.mely
31-05-2018, 01:31:18
Buenas tardes, tengo un problema y no sé si alguien pueda ayudarme; verán, a través de un formulario en Delphi 7 estoy guardando una imagen .jpg en un campo 'IMAGEN' tipo LONGBLOB, el problema es que al consultar el registro desde mi formulario algunas imágenes se me muestran incompletas.

Buscando información encontré en LONGBLOB es el que acepta archivos más grandes, entonces no sé a que se deba, o si debo de utilizar otro tipo de dato.

De antemano gracias y saludos!

Casimiro Notevi
31-05-2018, 09:00:43
No somos adivinos, debes decir qué base de datos usas, qué componentes, qué código estás usando para guardarla y para leerla, etc.
Por favor, no olvides leer nuestra guía de estilo (https://www.clubdelphi.com/foros/guiaestilo.php), gracias y bienvenido a clubdelphi.

Por cierto, tu otro mensaje está muy relacionado con este, realmente viene a ser lo mismo, así que los he unido.

ecfisa
31-05-2018, 16:13:21
Hola.

..., el problema es que al consultar el registro desde mi formulario algunas imágenes se me muestran incompletas.
...

Además de lo dicho por Casimiro, revisa que el control TImage tenga su propiedad Strech con el valor True.

Saludos :)

oh.mely
31-05-2018, 18:08:39
Hola, gracias por responder y pido una disculpa por no formular bien mi duda. Ya arreglé el problema, he optado por guardar la ruta de la imagen y no la imagen como tal en mi BD, por lo que leí en varios blogs y foros es lo más "óptimo".

La propiedad Strech de mi TImage si era True, lo que pasaba es que no la cargaba completa cuando me mostraba la imagen, aparecía como cortada, por lo que leí se debía a que las fotos que se mostraban así eran muy grandes para el campo longblob, por eso he recurrido a hacerlo de la otra manera.

Saludos.

Casimiro Notevi
31-05-2018, 19:30:11
Hola, gracias por responder y pido una disculpa por no formular bien mi duda. Ya arreglé el problema, he optado por guardar la ruta de la imagen y no la imagen como tal en mi BD, por lo que leí en varios blogs y foros es lo más "óptimo".Depende, siempre depende.


La propiedad Strech de mi TImage si era True, lo que pasaba es que no la cargaba completa cuando me mostraba la imagen, aparecía como cortada, por lo que leí se debía a que las fotos que se mostraban así eran muy grandes para el campo longblob, por eso he recurrido a hacerlo de la otra manera.

Bueno, eso no es así, si aparecía cortada es porque no la habías guardado bien o no la has cargado bien. Un campo blob puede almacenar "cosas" de muchos gigas, y no creo que esas imágenes fuesen tan grandes.