Ver Mensaje Individual
  #12  
Antiguo 15-02-2017
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
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({ parametros }): TStream;
  end;
{$METHODINFO OFF}


procedure TServer.RecibirImagen(Stream: TStream);
begin
  Stream.Position := 0;
 // utilizar el parametro Stream para lo que haga falta
end;

function TServer.ObtenerImagen(/*parametros*/): TStream;
begin
  { inicializar Result, es decir, crear algun descendiente de TStream. En este caso uso TFileStream }
  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
  // desde un archivo en disco local
  Stream := TFileStream.Create(RutaImagen, fmOpen or fmRead);
  try
    ClientMethods1.RecibirImagen(Stream);
  finally
    Stream.Free; {*}
  end;

  // desde un componente TImage
  Stream := TMemoryStream.Create;
  try
    Image1.SaveToStream(Stream);
    ClientMethods1.RecibirImagen(Stream);
  finally
    Stream.Free; {*}
  end;
end;

procedure PedirImagen;
var
  Stream: TStream;
begin
  Stream := ClientMethods1.PedirImagen({ parametros });
  try
    Stream.Position := 0;
    // cargar en un TImage
    Image1.LoadFromStream(Stream);

    // grabar a disco
    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
Responder Con Cita