如何通过Datasnap REST服务器将blob存储到数据库?

时间:2017-01-16 17:30:36

标签: rest delphi blob firedac firemonkey-fm3

Preample:

我们使用Firemonkey应用程序,然后与DataSnap REST服务器进行交互。该服务器使用SQLite数据库。在客户端,我们使用FireDac Memtable来管理数据。通常,为了更新数据,我们编辑FDMemTable,然后我们使用一个名为ApplyUpdate的函数(简单地说)创建一个TFDJSONDeltas,然后将其传递给服务器以应用更新。这适用于所有"标准"数据类型。

现在我们必须在数据库中存储blob,这是企业的标识。

一些调查:

我们发现了一些使用FDQuery的PARAMS和EXECUTE函数的例子,但我们在客户端没有FDQuery。许多示例都是针对FDQuery的,我们没有看到FDMemTable的示例。 FDMemtable没有ExecSQL函数。

我们也看到很多algo与TBlobStream,(但除非我们错过正确的单位声明),这个对象似乎没有在Firemonkey方面实现。

问题:

有一种方法可以使用FDMemTable执行此任务,还是首先将图像上传到服务器然后让服务器执行任务以将图像添加到blob字段?

1 个答案:

答案 0 :(得分:3)

我可以使用以下内容向DataSnap REST Server发送blob字段:

客户方:

var
   mes: TMemoryStream;
   FDMemUp: TFDMemTable;
   LDeltaList: TFDJSONDeltas;
  begin
   mes:= TMemoryStream.Create;

   FDMemUp:= TFDMemTable.Create(nil);
   FDMemUp.CachedUpdates:= true;
   FDMemUp.FieldDefs.Add('IMAGE',ftBlob);
   FDMemUp.FieldDefs.Add('ID',ftInteger);
   FDMemUp.CreateDataSet;

   //append one record with blob field filled from stream
   FDMemUp.Append;
   (FDMemUp.FieldByName('ID') as TIntegerField).AsInteger:= 106;
   (FDMemUp.FieldByName('IMAGE') as TBlobField).LoadFromStream(mes);
   FDMemUp.Post;

   //send dataset to server 
   try
    try
      LDeltaList:= TFDJSONDeltas.Create;
      TFDJSONDeltasWriter.ListAdd(LDeltaList, 'INFOLOGO', FDMemUp);
      Result:= DM.ServerCoreClient.SendData(LDeltaList);
    except
      Result:= nil;
    end;
   finally
    FreeAndNil(FDMemUp);
    FreeAndNil(mes);
   end;

然后在服务器端处理数据:

function TDMCore.SendData(const ADeltaList: TFDJSONDeltas): boolean;
var
 LApply: IFDJSONDeltasApplyUpdates;
 mes: TMemoryStream;
begin
 LApply:= TFDJSONDeltasApplyUpdates.Create(ADeltaList);
 if (LApply.Values[0].RecordCount > 0) then
  begin
   mes:= TMemoryStream.Create;
   LApply.Values[0].First;
   while not LApply.Values[0].Eof do
    begin
     mes.Clear;
     //read stream data from blob field
     (LApply.Values[0].Fields[1] as TBlobField).SaveToStream(mes);
     mes.Position:= 0;
     //Use stream to insert in a database or create a image or whatever the stream represent
     LApply.Values[0].Next;
    end;
   result:= true;
  end else result:= false;
 end;
相关问题