我有一个 Android 应用程序,它使用 XE2 中的 RESTFul 客户端内容将数据发送回 datasnap 服务器。
我可以很好地发送标准基本数据,但应用程序的一部分包括存储用户拍摄的图像。
我最初尝试使用 TStream,但从未返回到服务器 - 它似乎只是挂起。我目前的想法是将图像的 byte[] 转换为 base64 字符串并在 datasnap 端重新转换。
要在 Android 端将图像转换为 base64 字符串,我执行以下操作:
ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, stream);
String encodedString = Base64.encode(stream.toByteArray)
encodedString
然后作为标准 Delphi 字符串发送
在服务器端,要解码的代码是
function Base64Decode(const EncodedText: string): TBytes;
var
DecodedStm: TBytesStream;
Decoder: TIdDecoderMIME;
begin
Decoder := TIdDecoderMIME.Create(nil);
try
DecodedStm := TBytesStream.Create;
try
Decoder.DecodeBegin(DecodedStm);
Decoder.Decode(EncodedText);
Decoder.DecodeEnd;
Result := DecodedStm.Bytes;
SetLength(Result, DecodedStm.Size); // add this line
finally
DecodedStm.Free;
end;
finally
Decoder.Free;
end;
end;
然后
var
Bytes : TBytes;
image : TJPEGImage;
stream : TBytesStream;
begin
Bytes := Base64Decode(Photo);
stream := TBytesStream.Create(Bytes);
image := TJPegImage.Create;
image.LoadFromStream(stream);
这会在方法中产生错误loadFromStream
,基本上 jpeg 已损坏。我猜要么编码有问题(不太可能),要么转换为delphi字符串然后解码为字节[](可能)。
所以这是一个冗长的方式来询问是否有人对如何将图像从 Android 应用程序发送到 Delphi XE2 中的 DataSnap 服务器有任何建议?