首页 > 解决方案 > DecodeBase64 和 EncodeBase64 在 Delphi 10.2 和 10.3 中的行为不同

问题描述

我有以下两个程序:

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

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

有以下要求:

我使用过 DelphiSoap.EncdDecdSystem.NetEncoding库。

当前流程:

TImage移动应用程序上的位图转换为内存流,并将其转换为 base64 字符串。将图像作为字符串发布到弹性服务器。在 flex 服务器上,基于Soap.EncdDecd.

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

代码如下所示:

Var FImage: TMemoryStream;
sImageBlob : String 

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

在 flex 服务器中,我使用 decode 方法将其解码并保存到数据库中:

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

问题:

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

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

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

标签: delphiimage-processingfiremonkey

解决方案


找到了解决方案,如下:

从 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 服务器端使用 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));

推荐阅读