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

Исправление ошибок доступа при работе с TMemoryStream в Delphi-приложениях с REST DataSnap

Delphi , Графика и Игры , Изображения

Вопрос, с которым вы столкнулись, связан с использованием TMemoryStream для передачи изображений между клиентом и сервером в приложении на Delphi 10.1 с использованием REST DataSnap. Ошибка доступа происходит при попытке сохранения изображения на сервере в базу данных и при попытке отображения изображения на клиенте.

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

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

Решение проблемы

В подтвержденном ответе предложен способ решения проблемы с использованием базовых 64-битных строк для передачи изображений, что позволяет избежать ошибок, связанных с передачей больших потоков данных. Вот примеры кода, которые решают проблему:

На сервере: получение изображения из базы данных

PngImage := TPngImage.Create;
MemoryStream := TMemoryStream.Create;
try
  (TBlobField(FieldByName('Image'))).SaveToStream(MemoryStream);
  MemoryStream.Position := 0;
  PngImage.LoadFromStream(MemoryStream);
  Job.Image_AsStr := Base64FromPngImage(PngImage);
finally
  MemoryStream.Free;
end;

На клиенте: отображение изображения на форме

if (Job.Image_AsStr <> '') then
begin
  rImage.Fill.Kind := TBrushKind.Bitmap;
  rImage.Fill.Bitmap.Bitmap := BitmapFromBase64(Job.Image_AsStr);
  rCustomer_Signature.Repaint;
  lCustomer_Signature.Repaint;
end;

На клиенте: получение изображения с формы

if not(rImage.Fill.Bitmap.Bitmap.IsEmpty) then
begin
  rImage.Fill.Kind := TBrushKind.Bitmap;
  Job.Image_AsStr := Base64FromBitmap(rImage.Fill.Bitmap.Bitmap);
end
else
  Job.Image_AsStr := '';

На сервере: сохранение изображения в базе данных

if Job.Image_AsStr <> '' then
begin
  MemoryStream := TMemoryStream.Create;
  try
    PngImage := PngImageFromBase64(Job.Image_AsStr);
    PngImage.SaveToStream(MemoryStream);
    MemoryStream.Position := 0;
    Params[1].LoadFromStream(MemoryStream, ftBlob);
  finally
    MemoryStream.Free;
  end;
end
else
  Params[1].Clear;

В этих примерах предполагается, что функции Base64FromPngImage, BitmapFromBase64 и аналогичные им реализованы в вашем приложении. Они должны преобразовывать изображения в базовые 64-битные строки и обратно.

Альтернативное решение

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

Заключение

Использование базовых 64-битных строк для передачи изображений позволяет избежать многих проблем, связанных с передачей больших потоков данных, и может быть эффективным решением в контексте вашего приложения на Delphi с REST DataSnap.

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

Исправление ошибок доступа при работе с TMemoryStream в Delphi-приложениях, использующих REST DataSnap для передачи изображений, с рекомендациями по использованию базовых 64-битных строк для устранения проблемы.


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

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




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


:: Главная :: Изображения ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-20 22:37:12/0.0020120143890381/0