Hola junyandroid, bienvenido a Club Delphi
Quiza el codigo que se publico en el hilo pueda dar lugar a confusiones para alguien novato.
Las "imagenes" no son mas que un monton de caracteres (que no son mas que "bytes") con algun formato en particular. Luego hay componentes o bibliotecas que saben interpretarlo para que se pueda ver en pantalla. Pero no deja de ser un "string gigantesco".
Si tanto tu servidor como cliente son Delphi, la forma mas sencilla de trabajar es usando Streams, en la que basicamente estas trabajando al nivel "bytes". Datasnap es capaz de manejar descendientes de TStream sin que haya necesidad de intervenir ni hacer nada mas
El servidor expone metodos de este estilo: (escribo de memoria, se me puede escapar algun detalle la sintaxis)
Código Delphi
[-]
type
{$METHODINFO ON}
TServer = class(TDataModule)
public
procedure RecibirImagen(Stream: TStream);
function ObtenerImagen(): TStream;
end;
{$METHODINFO OFF}
procedure TServer.RecibirImagen(Stream: TStream);
begin
Stream.Position := 0;
end;
function TServer.ObtenerImagen(/*parametros*/): TStream;
begin
Result := TFileStream.Create(RutaImagen, fmOpen or fmRead);
end;
El cliente (ClientMethods1 es la clase proxy que te genera datasnap)
Código Delphi
[-]
procedure EnviarImagen;
var
Stream: TStream;
begin
Stream := TFileStream.Create(RutaImagen, fmOpen or fmRead);
try
ClientMethods1.RecibirImagen(Stream);
finally
Stream.Free;
end;
Stream := TMemoryStream.Create;
try
Image1.SaveToStream(Stream);
ClientMethods1.RecibirImagen(Stream);
finally
Stream.Free;
end;
end;
procedure PedirImagen;
var
Stream: TStream;
begin
Stream := ClientMethods1.PedirImagen();
try
Stream.Position := 0;
Image1.LoadFromStream(Stream);
Stream.SaveToFile(RutaArchivo);
finally
Stream.Free;
end;
end;
{*}: No recuerdo exactamente pero es posible que Datasnap se haga cargo del manejo de memoria de los objetos que pasan a traves del proxy. En ese caso los bloques try-finally sobran y el Free no solo no es necesario sino que podria generar errores.
En realidad no se porque siempre hubo tanto rollo con el base64. Se ha convertido en una suerte de "estandar" cuando en realidad no tiene demasiadas ventajas (la codificacion lleva tiempo, se incrementa el tamaño del stream adicional..). El unico caso en que usaria base64 es si estoy comunicandome con un webservice que ya este implementado asi y no pueda cambiar