Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Image in Blob field (Web-Application) (https://www.delphipraxis.net/206153-image-blob-field-web-application.html)

Ykcim 24. Nov 2020 14:26

Datenbank: MySQL • Version: 5 • Zugriff über: FireDac

Image in Blob field (Web-Application)
 
Hallo Zusammen,

ich versuche gerade meine erste Web-Application zu programmieren und würde mich über Unterstützung sehr freuen!

Ich nutze zwar TMS WebCore aber ich glaube, die Frage hat nicht wirklich etwas damit zu tun...

Ich lade ein Bild in ein Image, speicher das Image in einen Stream und möchte dann den Stream in einem Blob-Feld in dem MySQL-Server speichern. Aber das bekomme ich leider nicht hin. Ich bekomme auch keine Fehlermeldung, es kommt nur nichts in der DB an.

Delphi-Quellcode:
procedure TForm_TVclient_Main.WFP_LogoChange(Sender: TObject);
var  Img_URL: string;
      Image_File: TJSHTMLFile;
      MStream: TMemoryStream;
begin
   if Assigned(WFP_Logo.Files[0]) then begin
      // Load Picture in TWebImageControl
      Image_File:=WFP_Logo.Files.Items[0].FileObject;
      Img_URL:= Application.ObjectURL(Image_File);
      Img_Logo1.URL:= Img_URL;  //Das Bild wird korrekt angezeigt.
      //Upload the Picture to MySQL as Blob
      MStream:= TMemoryStream.Create;
      Try
         MStream.Position:=0;
         Img_Logo1.SaveToJSONStream(MStream);
         MStream.Position:=0;
         DataModule_Client.DataSet_NewLogo.Insert;
         DataModule_Client.DataSet_NewLogo.FieldByName('logo').LoadFromJSONStream(MStream);
         DataModule_Client.DataSet_NewLogo.FieldByName('company_id').AsInteger:=1; //Nur zum Testen
         DataModule_Client.DataSet_NewLogo.FieldByName('logo_id').AsInteger:=1; //Nur zum Testen
         DataModule_Client.DataSet_NewLogo.Post;
      Finally
         MStream.Free;
      End;
   end;
end;
Kann mir jemand einen Tip geben, warum das nicht fliegt?

Vielen Dank
Patrick

Delphi.Narium 24. Nov 2020 18:06

AW: Image in Blob field (Web-Application)
 
Warum bei 'nem Bild bitte LoadFromJSONStream?

Bilder im JSON-Format?

Vielleich mal einfach nur 'nen Stream laden?

Delphi-Quellcode:
DataModule_Client.DataSet_NewLogo.FieldByName('logo').LoadFromStream(MStream);

Ykcim 24. Nov 2020 18:34

AW: Image in Blob field (Web-Application)
 
Das habe ich auch versucht, aber LoadFromStream kennt er angeblich nicht...

Delphi.Narium 24. Nov 2020 18:59

AW: Image in Blob field (Web-Application)
 
Hilft das als Idee? https://www.delphipraxis.net/1366902-post18.html

Ansonsten mal oben rechts bei Suche Blob Image eingeben und durch die Ergebnisse wühlen. Etliche tausend Treffer zum Thema, keine Ahnung welche der dort aufgeführten Lösungen die für Dich passende ist, aber die richtige Lösung ist bestimmt dabei ;-) wenn eventuell auch nicht unbedingt auf Anhieb auffindbar :-(.

Weitere Suchbegriffe:

createblobstream
tblobfield

Delphi-Quellcode:
TBlobField(DataModule_Client.DataSet_NewLogo.FieldByName('logo')).SaveToStream(MStream);

Ykcim 24. Nov 2020 20:38

AW: Image in Blob field (Web-Application)
 
Vielen Dank.

Sag mal kannst Du mir sagen, was der Unterschied zwischen einem TStream oder TMemoryStream und einen JSONStream ist? Ich bekomme die Dinger leider nicht ausgelesen, damit ich mir die Struktur ansehen kann...

Gruß
Patrick

hoika 24. Nov 2020 21:31

AW: Image in Blob field (Web-Application)
 
Hallo,
mit Stream.Size bekommt man immerhin die Größe raus.
Was ist denn Dein TImage für eine Klasse.
Dass es dafür kein SaveToStream gibt, ist schon merkwürdig.

Der SQL-Code von DataSet_NewLogo wäre auch nicht schlecht.

Ykcim 25. Nov 2020 16:16

AW: Image in Blob field (Web-Application)
 
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

Ykcim 25. Nov 2020 17:27

AW: Image in Blob field (Web-Application)
 
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
Delphi-Quellcode:
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

Delphi.Narium 25. Nov 2020 18:00

AW: Image in Blob field (Web-Application)
 
Base64 ist doch ein String.
Delphi-Quellcode:
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

Ykcim 27. Nov 2020 10:57

AW: Image in Blob field (Web-Application)
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz