Вопрос, с которым вы столкнулись, связан с использованием TMemoryStream для передачи изображений между клиентом и сервером в приложении на Delphi 10.1 с использованием REST DataSnap. Ошибка доступа происходит при попытке сохранения изображения на сервере в базу данных и при попытке отображения изображения на клиенте.
Анализ проблемы
Проблема может быть связана с неправильным управлением памятью, в частности, с неправильным освобождением ресурсов TMemoryStream или ошибками в логике передачи данных. Также возможно, что размер передаваемых изображений превышает допустимый лимит, что приводит к обрезке данных.
Решение проблемы
В подтвержденном ответе предложен способ решения проблемы с использованием базовых 64-битных строк для передачи изображений, что позволяет избежать ошибок, связанных с передачей больших потоков данных. Вот примеры кода, которые решают проблему:
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