DecodeBase64 和 EncodeBase64 在 Delphi 10.2 和 10.3 中的行为不同

DecodeBase64 and EncodeBase64 behaves differently in Delphi 10.2 and 10.3

我有以下两个程序:

  1. 一个 flex 服务器(Delphi 10.2 程序作为接受 POST 和 GET API 调用的服务运行)

  2. FireMonkey 中的移动应用程序(Delphi 10.3 多设备应用程序,构建到 Android 和 iOS)

有以下要求:

我使用了 Delphi 的 Soap.EncdDecdSystem.NetEncoding 库。

当前进程:

将移动应用程序上的 TImage 位图转换为内存流并将其转换为 base64 字符串。 POST 将图像作为字符串发送到 flex 服务器。在flex服务器上,根据Soap.EncdDecd中的base64解码方法将字符串解码回内存流。

在移动应用程序上,我将图像转换为 Base64 字符串,然后通过 API 调用发送。

代码如下所示:

Var FImage: TMemoryStream;
sImageBlob : String 

FAttachedImage.SaveToStream(FImage); // FAttachedImage is a TImage
sImageBlob  := EncodeBase64(FImage.Memory,  FImage.Size)

而在flex server中,我用decode方法解码回来保存到DB中:

Var Serverimage: TMemoryStream;
Serverimage  := TBytesStream.Create(DecodeBase64(sImageBlob  ))

问题:

由于 flex 服务器是 10.2 版,它会将其解码回 AnsiString,即使我使用相同的库 (Soap.EncdDecd),移动应用程序也会将其编码为 [=19] =],导致无法检索正确的图像。

在我看来,主要问题在于 Soap.EncdDecd 有两个 Delphi 版本。在 Delphi 10.2 中,它将字符串解码为 AnsiString 并且 FireMonkey (Delphi 10.3) 将图像内存流编码为字符串。 Delphi 10.2 flex 服务器如何处理我通过使用 JavaScript 库编码为 base64 的网络应用程序发送的字符串。

有人可以帮我解决这个问题,或者提供另一种方法来通过 API 调用将图像作为字符串传递吗?并将其转换回 API 服务器中的内存流。

找到解决方法如下:

来自 firemonkey 应用程序:

var
  AnAttachment: TMemoryStream;
  lMemoria: TMemoryStream;
  lStrEnv: TStringStream;
  AJSONObject : TJSONObject

 // 
 AJSONObject  := TJSONObject.Create;
 
 AnAttachment.ImageBlob.Position := 0;
 lStrEnv := TStringStream.Create;
 TNetEncoding.Base64.Encode(AnAttachment, lStrEnv);

 AJSONObject.AddPair('ImageBlob', lStrEnv.DataString);

// 来自flex server端 使用 Soap.EncdDecd;

 var 
 JSON: TJSONObject;

 //sJSONString is the JSON String that comes via the API call 
 JSON := TJSONObject.ParseJSONValue(sJSONString) as TJSONObject;

 AnAttachment: TMemoryStream;

 AnAttachment :=  TMemoryStream.Create;

 AnAttachment  := TBytesStream.Create(DecodeBase64(JSON.GetValue('ImageBlob').ToJSON));