![]() |
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:
Kann mir jemand einen Tip geben, warum das nicht fliegt?
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; Vielen Dank Patrick |
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);
|
AW: Image in Blob field (Web-Application)
Das habe ich auch versucht, aber LoadFromStream kennt er angeblich nicht...
|
AW: Image in Blob field (Web-Application)
Hilft das als Idee?
![]() 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);
|
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 |
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. |
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:
Ich habe noch garkeine SQL-Statements gemacht. Ich habe einen xDataServer laufen, der eine Classe mit allen Datenbanktabellen enthält.
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; Ü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 |
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:
Das Ergebnis ist, dass das Bild im TWebImageControl wieder korrekt geladen wird.
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=='; Ich brauche also nur einen Weg, um den Blob-Wert aus
Delphi-Quellcode:
wieder in einen String umwandeln zu können.
DataModule_Client.DataSet_NewLogo.FieldByName('logo')
Hat da jemand einen Anstoß für mich? Vielen Dank Patrick |
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): ![]() Sieht so aus, als könnte man es 1:1 nach Delphi übernehmen. Weitere Ergebnisse mit Hilfe einer Suchmaschine: ![]() |
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:
Dabei wurde der Logo_String beim Aufruf erzeugt und übergeben:
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;
Delphi-Quellcode:
Wenn ich das Image wieder aus der DB lade weise ich es mit dieser Procedure dem Image wieder zu:
var IMG_Base64: string;
begin IMG_Base64:=Img_Logo2.DataURL; DataModule_Client.Save_NewLogo(Img_Base64);
Delphi-Quellcode:
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.
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; 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 04:51 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