delphi - DecodeBase64 和 EncodeBase64 在 Delphi 10.2 和 10.3 中的行为不同
问题描述
我有以下两个程序:
弹性服务器(Delphi 10.2 程序,作为接受 POST 和 GET API 调用的服务运行)
FireMonkey 中的移动应用程序(Delphi 10.3 多设备应用程序,适用于 Android 和 iOS)
有以下要求:
- 通过 API 调用从移动应用程序将图像发布到弹性服务器。
我使用过 DelphiSoap.EncdDecd
和System.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 服务器中的内存流。
解决方案
找到了解决方案,如下:
从 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));
推荐阅读
- asp.net - 使用现有数据库的身份和角色提供者的登录系统
- java - 为什么在我将 JComboBox 添加到其中一个 JPanel 之后,所有 JPanel 都没有呈现
- git - 推送到 GitHub 后的回调
- java - android java switch 语句中缺少或丢弃循环周期
- javascript - 在图表图例上显示工具提示 (Echarts)
- visual-studio-2015 - 如何在 Visual Studio 2015 中创建安装程序?
- ansible - Ansible - 在循环中将一个剧本包含到另一个剧本中
- azure-sql-server - Azure SQL Server 的命名约定前缀是什么
- python - Matplotlib secondary_xaxis 无法格式化
- python - 虚拟机上的 Neo4j 图形可视化可以嵌入到我的烧瓶 UI 中吗?