AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Image in Blob field (Web-Application)
Thema durchsuchen
Ansicht
Themen-Optionen

Image in Blob field (Web-Application)

Ein Thema von Ykcim · begonnen am 24. Nov 2020 · letzter Beitrag vom 19. Dez 2020
Antwort Antwort
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#1

AW: Image in Blob field (Web-Application)

  Alt 25. Nov 2020, 16:16
Die Applikation, die ich gerade versuche ist eine Web-Application mit TMS Web Core.

Ich habe das Image (TWebImageControl) jetzt geschafft in ein Blob-Feld zu speichern:

Delphi-Quellcode:
procedure TForm_TVclient_Main.WFP3Change(Sender: TObject);
var Img_URL: string;
      Image_File: TJSHTMLFile;
      Img_Base64: string;
begin
   if Assigned(WFP3.Files[0]) then begin
      // Load Picture in TWebImageControl
      Image_File:=WFP3.Files.Items[0].FileObject;
      Img_URL:= Application.ObjectURL(Image_File);
      Img_Logo2.URL:= Img_URL;
      //Upload the Picture to MySQL as Blob
      Try
         Img_Base64:=Img_Logo2.Base64Image;

         DataModule_Client.DataSet_NewLogo.Insert;
         DataModule_Client.DataSet_NewLogo.FieldByName('logo').AsString:=Img_Base64; //Das ist ein Blob

         //Das habe ich nur aus Verzweiflung gemacht, weil ich das Bild aktuell nicht geladen bekomme
         DataModule_Client.DataSet_NewLogo.FieldByName('logo2').AsString:=Img_Base64; // Das ist ein VChar(9999)

         DataModule_Client.DataSet_NewLogo.FieldByName('company_id').AsInteger:=5; //Only for testing
         DataModule_Client.DataSet_NewLogo.FieldByName('logo_id').AsInteger:=6; //Only for testing
         DataModule_Client.DataSet_NewLogo.Post;
         DataModule_Client.DataSet_NewLogo.ApplyUpdates;
      Except
         ShowMessage('Error');
      End;
   end;
end;
Ich habe noch garkeine SQL-Statements gemacht. Ich habe einen xDataServer laufen, der eine Classe mit allen Datenbanktabellen enthält.
Über eine Connection greife ich auf den Server zu und kann mit DataSet.Open die Daten laden. Wenn ich mit meiner Application die ersten Schritte geschafft habe, werde ich entsprechende SQL-Statements noch definieren müssen...

Aktuell verzeweifel ich daran, das Image aus dem Blob-Feld zu laden. Hat da jemand eine Idee?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#2

AW: Image in Blob field (Web-Application)

  Alt 25. Nov 2020, 17:27
Ich habe gerade mal den Base64 String, bevor er in die Datenbank geschrieben wurde abgefangen und in eine TextDatei kopiert. Dort habe ich Zeilenumbrüche, Hockommas und Pluszeichen eingefügt und dann in folgende Procedure kopiert:

Delphi-Quellcode:
   Img_Logo2.URL:='data:image/png;base64,'+'iVBORw0KGgoAAAANSUhEUgAAAMIAAAAhCAYAAACLMXQdAAAgAElEQVR4Xu18B5QVVbb2V3Vz50QHMp2bHCQpCjqiSFDHgMAIOqOSkZw6oAJNg+QghplRZ+aZRpEsQUGyZBW6aRoQ6G5C59x9c9W/'+
'9j5V3Q3i4Lw389b713vX5QLurXvq1Dn72/vb397nSv0eelztdk8XSAZAVb1QFQPoZVAVQPVClhRIkgRFlQBZhgKZ/22EBEVR4HapsNtrMW78GCQlxUMCcPjQD5g7eyEKCitgkE1QZYnHpu9JCl0h'+
'QVJV0JCqrAKyhHZtE/HEkwPR/5E+CI+0wSwDOTk3MGzYOFTXuEHToZckiz8VjxuyTP8w8LiqfgEUQPIgPCQIc1KmIyYmGgsWLcLxY+cgSSZAUSFJMgyqASpNgMaUVHihQpIVXocm4cH4Tf/+eOK3'+
'A5CUGAmTGZAVwO2lOd3Elxt34JtvDuHm9ULAC1oRQKIJevmZAAWSauQ/FcmNuPiWSE2dit73dqLZwWEHcrKv4e+fbcK+vQdQUV4FGkVVVRhpAlB5bSVZhVeVeH6q143e996DFWuW4OChw0hfsArl'+
'5eUwmxWkJE/BiBGPQzaoYnHopUo8X6jA5m3fYs6cRfAqMvx9DJj32hwMHPQAxo6djkMHTkOWrIBXhqIAJpMJXq+2V7SuksJzCQkORM9eXTHyd8+gY+fWsNho3cSaXL9Wji2b9mDjhq9wI/8G74vq'+
'VSAZAcUL0JZLXhlGk4yIZmF45NG+ePK3jyE6NhJmA3AltwivTkzFxYv5fDHdj9bCbDbC7XHy48iSWbyv2SNdZzCq8PM3YfKUsRg2YjAMBqC8XMWunfuwacM2ZGXmwOVyaQtigCxLUGhBeBdofcnG'+
'nTQ5SJMmzVaXrVwMVRUPxtuoAEYZkOlNbx0kRYVqtkCFkcyFPzeQEauA06Fg8+bN6NipPdq2jeMHP3L4ByTPSUdJaQ1cHgUGgwEqxAMRECTebGHZAhdiTF8fMx4ZcD/GjH0RMW0i8NOlmxg6bBwq'+
'yx08hsdLxs94ZJDSYkkwNWw+GyMNpyAs1A+zZ89Em9hoLMp4EyePZ0FVBWgIDLRZhEEaQ8xDQ5osjJDA2659PGbNHIfuPdqDbOzYiTNYteo9/HDmPBQveQ6ZF8tkMEJRPAwG2iieA33G9uhFbFxz'+
'zJ07Bff16QqvAhzYfxLz31iKmzdKxBiqmI9Ka6PNR4DTC1k2smEaZRXdenTBmrXLceDgISxMX42KigrIqgMLF8zF8OEDodJ/+lj0bADcLmDjlm+QnLwYimqAv78FaSkzMXjI/Xj5pak4+t2PgGqG'+
'zHCmfaJ1Fc6P10YWRkF+xiCrCI8MxNTJYzHkiQchm4CzZy5hzep3cfxoJlxO8ez05DR/WhOFPJcqw2SywO12awboRcfOcZibPAOdOsQi/3oJJk1MQVbmJZgMZu3eXnZovMdsmMIBC1shA6b3VfgH'+
'mDF56lgMG/YEamvdWL/+A/zH3/4O1Wvg9aTn4WdhQ6P9IEep7TV/RkAhIEycoa5evZQNEeR52OuqAspuO4rzc1BWVoqW0W3hFxYJFSYGA19IQHB6sHnzVrRv3xZt2ybwgh05fBazZy9AUUElJKMR'+
'oaFBaBIRAEmiRRYPJQyWJgrU1NhxLb+IF87Xz4wxY0Zh+IinUFhYjBHDJqC8so78PoJDghARGcyGTtim+KSAPG8jLPAGehEU7ItRo55HREQU0hctxemTOXC6PQgM8kOLZhEwEpo070KLzZuuynA4'+

//viele weiter Zeile später

'rycP2dlfw2q+CUmq5mOYkkpVYQv8/TsisjnJsAQo4t40jgACUSOj2YSEpOdhMATA5chEdhYBQUZC4kOw2fppEYE0f5GEXvnpW1SU/whf3wjEJxFQ6cglyZbFTH0ICF5vLVq16oWQ4IHa9ykiFDIQ'+
'cnK+FkCI6QlfPwIaGXwmSgqPoLziDFRUih9boBOCfGzTBoshBOER3eATSLmPDfDmIuvcQbjc1WjVkpJligitOV+RJJJpC3D9+lF4lcto0SIA/w9jwH/n1CKA6QAAAABJRU5ErkJggg==';
Das Ergebnis ist, dass das Bild im TWebImageControl wieder korrekt geladen wird.

Ich brauche also nur einen Weg, um den Blob-Wert aus DataModule_Client.DataSet_NewLogo.FieldByName('logo') wieder in einen String umwandeln zu können.

Hat da jemand einen Anstoß für mich?

Vielen Dank
Patrick
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#3

AW: Image in Blob field (Web-Application)

  Alt 25. Nov 2020, 18:00
Base64 ist doch ein String.
DataModule_Client.DataSet_NewLogo.FieldByName('logo').AsString ?

Frei nach dem Motto: Wenn's mit .AsString reingeht, kommt's auch mit .AsString wieder raus

Den String mit Base64 musst Du dann decodieren und dem Image zur Anzeige "unterjubeln".

Für Lazarus dort ein bisserl Blättern (dritter Post): https://forum.lazarus.freepascal.org...?topic=39789.0

Sieht so aus, als könnte man es 1:1 nach Delphi übernehmen.

Weitere Ergebnisse mit Hilfe einer Suchmaschine: Bei Google suchenDelphi TImage Load Base64
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#4

AW: Image in Blob field (Web-Application)

  Alt 27. Nov 2020, 10:57
Du hast recht, so müsste es gehen. Ich habe mittlerweile einen Teil-Erfolg erzielt. Mit folgenden Proceduren kann ich ein Image in der DB speichern und auch wieder auslesen. Aber dazu muss ich es als ein VARCHAR() definieren. Wenn ich es mit einem Blob versuche, kommen irgendwie keine Daten wieder zurück...

Speicher-Procedure
Delphi-Quellcode:
function TDataModule_Client.Save_NewLogo(Logo_string: string): boolean;
begin
   Try
      if DataSet_NewLogo.State=dsBrowse then
         DataModule_Client.DataSet_NewLogo.Insert;
      DataSet_NewLogo.FieldByName('company_id').AsInteger:=DataSet_NewCompany.FieldByName('company_id').AsInteger;
      if Logo_string<>'then begin
         DataSet_NewLogo.FieldByName('logo').AsString:=Logo_string; //Das ist das Blob-Feld
         DataSet_NewLogo.FieldByName('logo_string').AsString:=Logo_string; //Der gleiche Wert noch einmal in das VARCHAR Feld
      end;
      DataSet_NewLogo.Post;
      DataSet_NewLogo.ApplyUpdates;
      Result:= true;
   Except
      Result:= false;
   End;
end;
Dabei wurde der Logo_String beim Aufruf erzeugt und übergeben:
Delphi-Quellcode:
var IMG_Base64: string;
begin
   IMG_Base64:=Img_Logo2.DataURL;
   DataModule_Client.Save_NewLogo(Img_Base64);
Wenn ich das Image wieder aus der DB lade weise ich es mit dieser Procedure dem Image wieder zu:
Delphi-Quellcode:
var Img_Base64: string;
begin
   DataModule_Client.DataSet_NewLogo.Cancel;
   DataModule_Client.DataSet_NewLogo.Open;
   Img_Base64:='data:image/png;base64,'+DataModule_Client.DataSet_NewLogo.FieldByName('logo_string').AsString;
   Img_Logo2.URL:=Img_Base64;
end;
Das klappt, wenn ich das mit dem VARCHAR-Feld "Logo_String mache, wenn ich stattdessen das Blob-Feld "logo" heranziehe, erhalte ich keinen auslesbaren Wert.

Verwenden tue ich eine MariaDB 10 und definiert ist das Feld einfach als Blob...

Ich würde es wirklich gerne mit einem Blob realisieren, denn sonst darf das Feld nur ca. 21.800 Zeichen haben. Und ich muss im weiteren Programm-Verlauf auch noch PDF-Dokumente speichern...

Vielen Dank für jede Anregung

Patrick
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#5

AW: Image in Blob field (Web-Application)

  Alt 27. Nov 2020, 11:40
Google: Bei Google suchenmariadb blob

1. Ergebnis: BLOB - MariaDB Knowledge Base
Link BLOB and TEXT Data Types
Bei den Text-Typen mal schauen.
LONGTEXT wählen.
Is sich Text, is sich Blob, is sich 4,294,967,295 Byte groß, sollte reichen

PS: Blob ist mit 65,535 Byte ja nun auch nicht wirklich gigantisch groß
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
856 Beiträge
 
Delphi 12 Athens
 
#6

AW: Image in Blob field (Web-Application)

  Alt 27. Nov 2020, 12:51
Ich hatte es schon mit LONGTEXT versucht, aber hatte keinen Erfolg. Trotzdem glaube ich, dass da das Problem liegt.
Die Zeichen sehen anders aus, wenn ich mir das VARCHAR Feld binär ansehe und das LongText Feld. IM VARCHAR (data:image/png;base64,iVBORw0KGgoAAAANSU...) kann ich die Daten lesen und im LONGTEXT (뎵܎½辵뾹؞��ܞ¶) sind die Zeichen anders.

Auch die Größe ist unterschiedlich. IM VARCHAR sind es 1.126 byte und im LongText sind es 1.690 byte.

Wenn ich die Daten aus der DB abrufe, dann bekomme ich bei dem VARCHAR Feld die korrekte Stringlänge angezeigt (1126), aus dem LongText bekomme ich eine 0 (Length(Feld))

Aber jetzt lässt sich das Bild auch nicht mehr aus dem VARCHAR Feld anzeigen. Ich werde noch wahnsinnig. Ich hänge jetzt schon 4 Tage an dem Problem...


Vielen Dank für die Unterstützung!

Patrick


EDIT:
Ok, jetzt lädt das Image aus dem VARCHR Feld wieder. Diese Asynchronität in Web-Applications macht mir noch wirklich Schwierigkeiten.

Jetzt fällt der Größen-Unterschied der Feldinhalte noch stärker aus: VARCHAR=18.458 byte und LONGTEXT=27.688 byte.

Muss ich den Wert aus dem LONGTEXT noch irgendwie umformatieren oder decoden?
Patrick

Geändert von Ykcim (27. Nov 2020 um 13:11 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#7

AW: Image in Blob field (Web-Application)

  Alt 27. Nov 2020, 14:03
Das noch irgendwas umformatiert werden muss, wäre eher kontraproduktiv.

Eigentlich erwarte ich bei 'nem Textfeld, egal ob Blob oder VarChar, dass da Text unverändert gespeichert und gelesen werden kann.

Speichere Logo_string bitte mal über 'ne Stringliste (o. ä.) als Datei und schau Dir die dann an. Da dürften nur Codepage-unabhängigen ASCII-Zeichen drinne sein. (Zur Kodierung werden die Zeichen A–Z, a–z, 0–9, + und / verwendet sowie = am Ende.)
Alles, was außerhalb dieses Bereiches liegt, könnte als Fehlerursache in Betracht gezogen werden.

Es wäre also wohl zuerstmal zu prüfen, ob das, was momentan als Base64 vermutet wird, auch tatsächlich Base64 ist.

Welchen Zeichensatz nutzt das Longtext? Findet da irgendwo eine unbeabsichtigte Zeichensatzkonvertierung statt?

Wenn die Probleme bleiben, eventuell auch mal die Inhalte aus dem VarChar und dem LongText via Stringliste (o. ä.) als Dateien speichern und dann quasi Logo_String, VarChar und LongText auf Dateiebene vergleichen.

Wenn das nix wird, die einfach mal hier anhängen, eventuell finden sich ja ein paar Adleraugen, die den Knackpunkt für dieses seltsame Verhalten entdecken können.

Eventuell auch noch das Originalbild hier dazupacken, so dass man mal "händisch" aus dem Bild Base64 macht und das mit dem von Deinem Programm erstellten vergleicht.

Oder:

https://www.base64decode.org/

Dort kann man zwischen "Encode to Base64 format" und "Decode from Base64 format" wählen (auch für Dateien).

Spendiere denen mal das Logo als Bilddatei und schaue, ob deren Ergebnis mit dem Deines Programmes übereinstimmt.

Und gönne denen mal Deinen Base64-String und schaue, ob die Dir Dein Logo daraus herstellen können.

Wenn das dort in beide Richtungen klappt und die Ergebnisse einwandfrei sind, können wir nach Fehlern beim Speichern in der Datenbank suchen. Solange nicht sicher ist, dass das, was Du speichern möchtest auch spezifikationskonform ist, hilft es nicht einen (möglichen) Fehler im Zusammenhang mit der Datenbank zu suchen.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#8

AW: Image in Blob field (Web-Application)

  Alt 28. Nov 2020, 08:52
IM VARCHAR (data:image/png;base64,iVBORw0KGgoAAAANSU...) kann ich die Daten lesen und im LONGTEXT (뎵܎½辵뾹؞��ܞ¶) sind die Zeichen anders.
Base64 ist ASCII, LongText scheint aber UFT8 zu enthalten.

Mir scheint das Speichern als Text, egal ob als VarChar oder als LongText irgendwie äußerst ungeeignet. Mit PDFs wird das dann sicherlich erst recht scheitern.

Das Folgende ist nur arg geraten, da gerade keine Testmöglichkeit gegeben ist:
Delphi-Quellcode:
function TDataModule_Client.Save_NewLogo(Logo_string: string): boolean;
var
  BF : TBlobField;
  TS : TStringStream;
begin
   try
     if DataSet_NewLogo.State = dsBrowse then DataModule_Client.DataSet_NewLogo.Insert;
     DataSet_NewLogo.FieldByName('company_id').AsInteger := DataSet_NewCompany.FieldByName('company_id').AsInteger;
     if Logo_string <> 'then begin
       TS := TStringStream.Create(Logo_string);
       TS.Position := 0;
       BF := DataSet_NewLogo.FieldByName('logo') as TBlobField;
       BF.LoadFromStream(TS);
       TS.Free;
     end;
     DataSet_NewLogo.Post;
     DataSet_NewLogo.ApplyUpdates;
     Result := true;
  except
     on : Exception do begin
       // Im Produktivbetrieb hier Fehler loggen.
       ShowMessage(e.Exception);
       Result := false;
     end;
  end;
end;
Wären eventuell der Typ VARBINARY(Maxmimalgröße in Byte) oder LongBlob nutzbare Alternativen?

Meine Befürchtung:

Die Speicherung als Strings, Text, VarChar, ... wird scheitern, da hier immer auf die Zeichensätze zu achten sein wird, $00 sicherlich immer Strings "zerstören" wird, spätestens bei PDF-Dateien ein gerantiertes Ko-Kriterium.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz