我有一个在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)查看。
有什么想法,我做错了什么,以及如何解决修复的例子?
谅谅
服务器从数据库获取图片:-
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的形式回到服务器。