![]() |
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 |
AW: Image in Blob field (Web-Application)
Google:
![]() 1. Ergebnis: ![]() Link ![]() Bei den Text-Typen mal schauen. ![]() 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ß ;-) |
AW: Image in Blob field (Web-Application)
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
Delphi-Quellcode:
kann ich die Daten lesen und im
VARCHAR (data:image/png;base64,iVBORw0KGgoAAAANSU...)
Delphi-Quellcode:
sind die Zeichen anders.
LONGTEXT (뎵܎½辵뾹؞��ܞ¶)
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? |
AW: Image in Blob field (Web-Application)
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: ![]() 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. |
AW: Image in Blob field (Web-Application)
Zitat:
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:
Wären eventuell der Typ
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; ![]() ![]() 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. |
AW: Image in Blob field (Web-Application)
Leider konnte ich Deinen Code nicht adaptieren. Obwohl die Autovervollständigung es angibt, meckert der Compiler bei
Delphi-Quellcode:
In TMS Web Core scheint es nicht verfügbar zu sein... oder ich begreife nicht, wie ich es korrekt aufrufen muss!
BF.LoadFromStream(TS);
Ich habe das Feld mal in ein LongBlob umgewandelt. Ich kann Daten zwar reinspeichern, aber die sehen dann wieder komisch aus:
Delphi-Quellcode:
Ist das zu gebrauchen, sodass ich beim Laden nur eine Umformatierung vornehmen muss oder ist das Murks? Wie würdest Du denn Images und später auch pdf-Dokumente speichern? Ich arbeite da jetzt schon eine geschlagene Woche dran...
ëÞzãnçnûßNã¾»è^5ã^5ã^ç~yëÎ9çž»ã^5ã^uè5ã^5ãn¼ã~5çÞ5ã^5ãŽ:ïž:玄ã^5ã^»ã^9è.9ç^zçmøçÎùß]ýãm÷ëÎz箸ëmöëüßžøïž¹è>ã®8ï^ßMøï}ôçnyç®<ã®7èNõç¾6ã^}çž{ëŽyà^øà¶ã~…ßž5à5àwçn7ï¾Àè]üß¾äüïŽ:ï^»çžyïN9ïŽ|ãÞvã^7ëÞ ãnußNëÎtënƒßûß÷Ø^{ßnùë~ƒã^·ß^}ï®ôè=ùß݅ﮄß~<èNƒï¾¹ç~¹ë}…çÝë]ß}õß¾öçιë^ß^Ø^ØýçŽùàM÷ç¾:ä5ãnyß^uß^zà>}ã]ãn‚çž6ç®8ëŽç~}ãžç~zãnyã~@ãn‚à ãùäýà>à=è^7ïMôà^:ìzë^ï~¹àN;ãÞýçž‚ãžvà5ë®|ï…ï¾@ïÎ@ã}ùãnºçž5ë^8ën=ãÞõç}…ïÎ÷ïžßÞwß®5è^ èõï^7ãÎõèNà½ãnë^ßÎù㾺ë}…à>6ãý߽߮ï^6ë¾öì8àuè÷à>:ï½øë^çn{ç¾zãžÀç^¸ØëÞýØ:ëŽüà^wãÎßÞ=à^6èMúïúà.…ã^7ç~7ßž9ëÎ}ëŽ½ëŽøè]ôïÎç½õïκïÞ:ã}÷ã΅ߎ7è.=è»è.uç®9ëÞwãŽ=àNõë¾9è^xè^;ëŽàøïÎuãÞ·èïÝúã® ç®6ëÍßMûßÍ…ß¾úØ^øã^ç^ïÍüãnãnƒç^:ë~ïNô玂ë®üßNºïNtßηçž|ë÷ãÍõë~»ãλãnè9è;ëÞ7ën„ߎ„ç^=ã¾ã¾úè.ºçn|ãÞ½ãÞ¶ãž‚ßNøà^„è^Ø^èN{è-öï^çž6à^¸è>|ßÎ=Ø]÷àMö㎄èøßN…àúßN5çNyç®zç®vëÎôã^‚ãn@ïŽôà÷ï¾õß^çN8Ø^zß¾yç~ºè=öØ^7ëÝúïž|çÞØ^¹ë®·ëÞ·ï®üà‚ïNµçžûè>üç¾ïNyß¾;ëÞ6ãÍ÷ç^xë^…ç^€è
ôçžwç¾¹à-õçn»ßùçÞúà>|ï*öç^öë¾zã¾yãÍãn÷ïÍýën€çÞ Vielen Dank für Deine Unterstützung! Patrick |
AW: Image in Blob field (Web-Application)
Löse dich von dem Gedanken, dass man textuelle Informationen ins Blobfeld speichert oder das als Text angucken kann/sollte.
In Blobfeld kommen wirklich nur die reinen "Bits und Bytes". |
AW: Image in Blob field (Web-Application)
Zitat:
Wenn der Compiler meckert: Bitte die Meldung des Compilers posten, sonst wissen wir nur, dass er meckert, aber nicht was er bemeckert. Damit ist eine verwertbare Hilfe fast ausgeschlossen. Weiter oben hast Du eine Speicherfunktion gepostet. Die hab' ich mal verändert.
Delphi-Quellcode:
Die Datei Logo_string.txt hängst Du bitte hier an, damit wir erstmal schauen können, was wir denn da bekommen. (Dabei gehe ich jetzt erstmal davon aus, dass in logo_string tatsächlich ein reiner String ist und nicht eventuell ein String für irgendwas binäres "verschlissen" wird.)
function TDataModule_Client.Save_NewLogo(Logo_string: string): boolean;
var sl : TStringList; begin Result := Length(Logo_string) > 0; if Result then begin sl := TStringList.Create; sl.Add(Logo_string); sl.SaveToFile('Logo_string.txt'); sl.Free; end; end; Kannst Du den Inhalt des Blobfeldes in eine Datei speichern? Wenn ja, mach' das bitte und häng' die Datei auch hier an. MySQL / MariaDB scheinen sowas in der Art zu unterstützen:
SQL-Code:
Bekommst Du eventuell damit irgendwas verwertbares zu Gesicht, dass Du dann beim Lesen aus der DB nutzen kannst?
SELECT
blobfield, CONVERT(blobfield USING utf16), CONVERT(CONVERT(blobfield USING utf16), BINARY), CAST(blobfield AS CHAR(10000) CHARACTER SET utf16), CAST(CAST(blobfield AS CHAR(10000) CHARACTER SET utf16) AS BINARY) from tabelle where company_id = 1 Schau bitte mal, ob die hier ![]() Habe halt nur Delphi 7, kein TMS und keine MariaDB, von daher ist das mit dem Selbstausprobieren bei mir eher schlecht bestellt :-( |
AW: Image in Blob field (Web-Application)
Liste der Anhänge anzeigen (Anzahl: 4)
Hallo,
vielen Dank für Deine Mühe, ich versuche alles zu beantworten. Zitat:
Zitat:
Delphi-Quellcode:
[Fataler Fehler] identifier not found "LoadFromStream"
Zitat:
ich habe mit der folgenden Funktion den String gespeichert:
Delphi-Quellcode:
Ich habe die 3 Dateien mit gepostet und auch das Logo. Bei Blob oder Longtext kommt nur Murks. Im StringField wird der gleiche Wert, wie er im Memo angezeigt wird, gespeichert. Diesen Wert kann ich dann auch nutzen und das Image wieder korrekt darstellen zu können.
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_image').AsString:=Logo_string; //Ergebnis in Datei Logo_LongBlob DataSet_NewLogo.FieldByName('logo_string').AsString:=Logo_string; //Ergebnis in Datei Logo_LongText DataSet_NewLogo.FieldByName('logo_char').AsString:=Logo_string; //Ergebnis in Datei Logo_StringField end; DataSet_NewLogo.Post; DataSet_NewLogo.ApplyUpdates; Result:= true; Except Result:= false; End; end; Zitat:
Zitat:
Vielen Dank für die Unterstützung! Patrick |
AW: Image in Blob field (Web-Application)
Ehrlich gesagt verstehe ich nicht mehr, wo da der Hund noch begraben sein könnte.
TBlobField hat die Methode CreateBlobStream. ![]() Da steht, was das Teil kann. Unten stehen weitere Möglichkeiten, sowas wie TSQLBlobStream, TMemoField. Seiten, die zum Thema beitragen könnten: ![]() ![]() (Das ist die Beschreibung eines Beispieles für FireDAC und Blobs, das bei Delphi dabei sein müsste.) Sorry, aber mit wirklich hilfreichen Infos kann ich wohl nicht mehr dienen. |
AW: Image in Blob field (Web-Application)
Vielen Dank, Du hast Dir wirklich viel Mühe gegeben!
Wenn ich noch zu einer Lösung komme, werde ich sie hier posten... |
AW: Image in Blob field (Web-Application)
Hallo zusammen,
endlich habe ich einen Weg gefunden, um ein Logo in der Datenbank zu speichern und auch wieder zu laden... Ich habe meine App komplett auf den Aufruf von Services umgebaut. Wenn ich das Logo in das TWebImageControl geladen habe, kann ich es jederzeit mit
Delphi-Quellcode:
als String bekommen. Ich habe festgestellt, dass ich diesen String zwar problemlos in ein DataSet laden kann, bei dem Versuch, daraus dann ein JSONObject zu machen, wird der String irgendwie verändert.
WebImageControl1.Base64
Ich habe daher selber ein JSONObject erstellt und dieses dem Service-Aufruf als Parameter mitgegeben. Damit funktioniert es.
Delphi-Quellcode:
Auf der Server-Seite passiert Folgendes:
procedure TDataModule_Client.Save_NewLogo(AOnDataRecieved: TDataRecievedCallback; Image_String: string);
procedure OnResponse(Response: TXDataClientResponse); begin if Assigned(AOnDataRecieved) then begin AOnDataRecieved(); end; end; var JSVal: JSValue; JSObj: TJSObject; JSString:string; begin Try JSString:= '{"company_id": '+IntToStr(DataSet_NewCompanycompany_id.AsInteger)+', '+ '"picture": "'+'data:image/png;base64,'+Image_String+'"}'; JSObj:=TJSJSON.parseObject(JSString); TVc_XDataWebClient.RawInvoke('ITV_CreateNewCustService.Insert_Logo',[JSObj], @OnResponse); Except MessageDlg('Es hat einen Fehler beim Speichern gegeben',WEBLib.Dialogs.mtError, [mbOK]); Exit; End; end;
Delphi-Quellcode:
Auslesen tue ich es mit einem normalen Select und behandle das Ganze wie einen String.
function TTV_CreateNewCustService.Insert_Logo(JSObj: TJSONObject): integer;
var Query: TFDQuery; begin Query:= TFDQuery.Create(nil); Query.Connection:=MySQL.MySQL_Cnnctn; Try Query.SQL.Clear; Query.SQL.Add('insert into company_logo '+ '(company_id, logo_image) '+ 'values '+ '(:company_id, :logo_image); '+ 'select last_insert_id() as ID '); Query.ParamByName('company_id').AsInteger:= StrToIntDef(TJSONString(JSObj.GetValue('company_id')).Value, 0); Query.ParamByName('logo_image').AsString:= TJSONString(JSObj.GetValue('picture')).Value; Query.Open; Result:= Query.FieldByName('id').AsInteger; Finally Query.Free; End; end; Vielleicht hilft es jemandem weiter. Vielen Dank für die Unterstützung Patrick |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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