如何在Delphi 10.1中使用DataSnap发送和接收TMemoryStream(在TObject中)。

问题描述 投票:0回答:1

我有一个在Delphi 10.1中使用REST Datasnap编写的应用程序。

这个应用程序包括一个客户端和服务器。

客户端是一个移动应用程序(Android),服务器是一个连接到火鸟数据库的Windows服务。

我有一个对象:-

TJob = class(TObject)
  private
    FID: Integer;
    FThe_Name: String;
    FImage: TMemoryStream;
  public
    constructor Create;
    destructor Destroy;
  end;

constructor TJob.Create;
begin
  inherited;
  FImage := TMemoryStream.Create;
end;

destructor TJob.Destroy;
begin
  FreeAndNil(FImage);
  inherited;
end;

当我试图将服务器上的图像保存到数据库中,以及在客户端打开和显示图像时,我得到了一个访问违规。

我有一个独立的多设备应用程序,它使用与客户端服务器相同的功能(获取、保存和显示图像),并且工作。

客户端在窗体上显示图像:-。

if (Job.Image.Size > 0) then
  begin
    rectangle.Fill.Kind := TBrushKind.Bitmap;
    rectangle.Fill.Bitmap.Bitmap.LoadFromStream(Job.Image);
    rectangle.Repaint;
    Layout.Repaint;
  end;

客户端从表格中获取图像:-

if not(rectangle.Fill.Bitmap.Bitmap.IsEmpty) then
  begin
    Job.Image.Seek(0, soFromBeginning);
    rectangle.Fill.Bitmap.Bitmap.SaveToStream(Job.Image);
    Job.Image.Position := 0;
  end;

服务器将图像保存到数据库:-

  Job.Image.Position := 0;
  (TBlobField(FieldByName('MyImage'))).SaveToStream(Job.Image);

服务器从DB中获取图像:-

(TBlobField(FieldByName('MyImage'))).SaveToStream(Job.Image);

单机版应用程序使用同样的方法工作,但是当我试图保存或显示图像时,我得到了错误。

我已经在DB中填充了各种格式的图像,我可以在DB中查看,但不能从客户端(AV)查看。

有什么想法,我做错了什么,以及如何解决修复的例子?

谅谅

image delphi delphi-10.1-berlin datasnap
1个回答
0
投票

服务器从数据库获取图片:-

  PngImage := TPngImage.Create;
  MemoryStream := TMemoryStream.Create;
  try
    (TBlobField(FieldByName('Image'))).SaveToStream(MemoryStream);
    MemoryStream.Position := 0;
    PngImage.LoadFromStream(MemoryStream);
    Job.Image_AsStr := Base64FromPngImage(PngImage);
  finally
    Bitmap.Free;
    MemoryStream.Free;
  end;

客户端在表单上显示图像:-。

  if (Job.Image_AsStr <> '') then
  begin
    rImage.Fill.Kind := TBrushKind.Bitmap;  
    rImage.Fill.Bitmap.Bitmap := BitmapFromBase64(Job.Image_AsStr);
    rCustomer_Signature.Repaint;
    lCustomer_Signature.Repaint;
  end;

客户端从表单中获取图片:-

  if not(rImage.Fill.Bitmap.Bitmap.IsEmpty) then
  begin
    rImage.Fill.Kind := TBrushKind.Bitmap;
    Job.Image_AsStr := Base64FromBitmap(rImage.Fill.Bitmap.Bitmap);
  end
  else
    Job.Image_AsStr := '';

服务器将图像保存到数据库:-

if Job.Image_AsStr <> '' then
begin
  MemoryStream := TMemoryStream.Create;
  try
    PngImage := PngImageFromBase64(Job.Image_AsStr);
    PngImage.SaveToStream(MemoryStream);
    MemoryStream.Position := 0;
    Params[1].LoadFromStream(MemoryStream, ftBlob);
  finally
    Bitmap.Free;
    MemoryStream.Free;
  end;
end
else
  Params[1].Clear;

根据我的经验,即使图像被打包为BMP,但它还是以PngImage的形式回到服务器。

© www.soinside.com 2019 - 2024. All rights reserved.