DecodeBase64 и EncodeBase64 по-разному ведут себя в Delphi 10.2 и 10.3 - PullRequest
0 голосов
/ 27 мая 2020

У меня есть следующие 2 программы:

  1. Гибкий сервер (Delphi программа 10.2, которая работает как служба, которая принимает вызовы POST и GET API)

  2. Мобильное приложение в FireMonkey (Delphi 10.3 приложение для нескольких устройств, которое собирает как Android, так и iOS)

Имейте следующее требование:

  • Отправьте изображение через вызов API из мобильного приложения на гибкий сервер.

Я использовал библиотеки Delphi Soap.EncdDecd и System.NetEncoding.

Текущий процесс:

Преобразование растрового изображения TImage на мобильном устройстве app в поток памяти и преобразуйте его в строку base64. Отправьте изображение на гибкий сервер в виде строки. На гибком сервере декодируйте строку обратно в поток памяти на основе метода декодирования base64 в Soap.EncdDecd.

В мобильном приложении я конвертирую изображение в строку Base64 перед отправкой через вызов API.

Код выглядит примерно так:

Var FImage: TMemoryStream;
sImageBlob : String 

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

И на гибком сервере я использую метод декодирования, чтобы декодировать его обратно и сохранять в БД:

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

Проблема:

Поскольку гибкий сервер имеет версию 10.2, он декодирует его обратно на AnsiString, где мобильное приложение, даже если я использую ту же библиотеку (Soap.EncdDecd), оно кодирует его как string, что приводит к невозможности получить обратно правильное изображение.

Основная проблема, как я вижу, внутри Soap.EncdDecd есть две Delphi версии. В Delphi 10.2 он декодирует строку в AnsiString, а FireMonkey (Delphi 10.3) кодирует поток памяти изображений в строку. Как бы то ни было, гибкий сервер Delphi 10.2 отлично работает со строками, которые я отправляю через веб-приложения, которые используют библиотеки JavaScript для кодирования в base64.

Может ли кто-нибудь помочь мне с этой проблемой или предоставить ДРУГОЙ способ передать изображение в виде строки через вызов API? И преобразовать обратно в поток памяти на сервере API.

...