У меня есть следующие 2 программы:
Гибкий сервер (Delphi программа 10.2, которая работает как служба, которая принимает вызовы POST и GET API)
Мобильное приложение в 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.