Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Использование DataSnap REST в RAD Studio: Решение проблемы с загрузкой изображений в ISAPI DLL

Delphi , Синтаксис , API реализация

Разработчики, работающие с RAD Studio, часто сталкиваются с необходимостью интеграции различных компонентов и библиотек для создания эффективных серверных решений. Одним из таких инструментов является DataSnap, который позволяет создавать REST-сервисы для обмена данными между клиентом и сервером. В этом контексте возникла проблема, связанная с загрузкой изображений в серверный метод, использующий DataSnap в виде ISAPI DLL.

Описание проблемы

Разработчик столкнулся с ошибкой доступа к памяти (access violation) при попытке загрузки изображения в метод сервера, который принимает изображение в формате base64, закодированное в JSON. При работе в виде standalone-приложения (exe-файл) всё функционировало корректно, но после сборки в виде ISAPI DLL и развертывания в IIS, возникла ошибка именно в той строке, где происходит загрузка изображения в TBitmap из TMemoryStream.

Анализ проблемы

Проблема была в использовании класса TBitmap из библиотеки FMX.Graphics, который предназначен для использования в FireMonkey-приложениях. При работе в контексте ISAPI DLL, который выполняется в среде VCL, использование FMX-компонентов может привести к несовместимости и ошибкам.

Подтвержденный ответ

Попытки отладки привели к выводу, что проблема кроется в использовании TBitmap из FMX. В качестве решения было предложено использовать класс TJPEGImage из библиотеки Vcl.Imaging.jpeg, который предназначен для VCL-приложений.

Решение

Для решения проблемы был изменён класс, используемый для загрузки изображения, с TBitmap на TJPEGImage. В коде серверного метода была произведена замена:

theImage := TJPEGImage.Create;

и загрузка изображения осуществляется через метод:

theImage.LoadFromStream(OutputStream);

После внесения этих изменений, строка, вызывавшая ошибку, начала работать корректно, и изображение успешно загружалось из TMemoryStream.

Пример кода

function TServerMethods1.GetImage(JSONObj: TJSONObject): Boolean;
var
  OutputStream: TMemoryStream;
  InputStream: TStringStream;
  TheImage: TJPEGImage;
begin
  var
    ImageStr: string := JSONObj.GetValue('Image').Value;
  InputStream := TStringStream.Create(ImageStr);
  try
    OutputStream := TMemoryStream.Create;
    TheImage := TJPEGImage.Create;
    try
      InputStream.Position := 0;
      TNetEncoding.Base64.Decode(InputStream, OutputStream);
      OutputStream.Position := 0;
      TheImage.LoadFromStream(OutputStream);
      // Дополнительный код обработки изображения
    finally
      TheImage.Free;
    end;
  finally
    InputStream.Free;
    OutputStream.Free;
  end;
  Result := True;
end;

Заключение

При работе с DataSnap в RAD Studio важно учитывать контекст выполнения приложения: VCL или FMX. В случае возникновения ошибок доступа к памяти при работе с изображениями в ISAPI DLL, рекомендуется использовать VCL-компоненты, такие как TJPEGImage. Это позволит избежать несоответствий и обеспечит корректную работу серверных методов.

Создано по материалам из источника по ссылке.

Разработчик столкнулся с проблемой загрузки изображений в серверный метод, использующий DataSnap в виде ISAPI DLL, из-за несовместимости компонентов FMX и VCL, и решение состояло в замене `TBitmap` на `TJPEGImage`.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: API реализация ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 11:54:36/0.01348614692688/1