Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

Delphi.Narium 27. Nov 2020 11:40

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

Ykcim 27. Nov 2020 12:51

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:
VARCHAR (data:image/png;base64,iVBORw0KGgoAAAANSU...)
kann ich die Daten lesen und im
Delphi-Quellcode:
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?

Delphi.Narium 27. Nov 2020 14:03

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:

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.

Delphi.Narium 28. Nov 2020 08:52

AW: Image in Blob field (Web-Application)
 
Zitat:

Zitat von Ykcim (Beitrag 1478064)
IM
Delphi-Quellcode:
VARCHAR (data:image/png;base64,iVBORw0KGgoAAAANSU...)
kann ich die Daten lesen und im
Delphi-Quellcode:
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.

Ykcim 28. Nov 2020 21:56

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:
BF.LoadFromStream(TS);
In TMS Web Core scheint es nicht verfügbar zu sein... oder ich begreife nicht, wie ich es korrekt aufrufen muss!

Ich habe das Feld mal in ein LongBlob umgewandelt. Ich kann Daten zwar reinspeichern, aber die sehen dann wieder komisch aus:
Delphi-Quellcode:
ëÞ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€çÞ
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...

Vielen Dank für Deine Unterstützung!
Patrick

TiGü 29. Nov 2020 00:12

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".

Delphi.Narium 29. Nov 2020 09:19

AW: Image in Blob field (Web-Application)
 
Zitat:

Zitat von Ykcim (Beitrag 1478137)
Leider konnte ich Deinen Code nicht adaptieren. Obwohl die Autovervollständigung es angibt, meckert der Compiler bei
Delphi-Quellcode:
BF.LoadFromStream(TS);
In TMS Web Core scheint es nicht verfügbar zu sein... oder ich begreife nicht, wie ich es korrekt aufrufen muss!

Für TBlobField muss Data.DB ins Uses, das hat nix mit TMS ... zu tuen, das ist reines Delphi und Datenbank.
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:
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;
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.)

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:
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
Bekommst Du eventuell damit irgendwas verwertbares zu Gesicht, dass Du dann beim Lesen aus der DB nutzen kannst?

Schau bitte mal, ob die hier https://stackoverflow.com/questions/...-text-in-mysql was für Dich verwertbares dabei haben.

Habe halt nur Delphi 7, kein TMS und keine MariaDB, von daher ist das mit dem Selbstausprobieren bei mir eher schlecht bestellt :-(

Ykcim 30. Nov 2020 14:51

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:

Für TBlobField muss Data.DB ins Uses, das hat nix mit TMS ... zu tuen, das ist reines Delphi und Datenbank.
Die Unit habe ich mit eingebunden, daran liegt es nicht.

Zitat:

Wenn der Compiler meckert: Bitte die Meldung des Compilers posten,
Sorry, mein Fehler!
Delphi-Quellcode:
[Fataler Fehler] identifier not found "LoadFromStream"
Zitat:

Die Datei Logo_string.txt hängst Du bitte hier an,
Ich habe mir letzte Woche bereits den String in einem Memo jedes Mal anzeigen lassen. Ich kann bestätigen, dass das der Wert ist, der in der DB gespeichert wird, wenn ich ein VARCHAR Feld definiere.

ich habe mit der folgenden Funktion den String gespeichert:
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_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;
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.

Zitat:

Bekommst Du eventuell damit irgendwas verwertbares zu Gesicht, dass Du dann beim Lesen aus der DB nutzen kannst?
Bis jetzt leider nicht, weil ich nur noch Murks in den Feldern habe... (Außer im VARCHAR-Feld)...

Zitat:

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".
Ich kann verstehen, dass Text nicht die richtige Speicherung für Dateien ist. Ich bin auch nicht versessen darauf, es so zu machen, ich suche nur irgendeine Möglichkeit, die funktioniert.

Vielen Dank für die Unterstützung!
Patrick

Delphi.Narium 30. Nov 2020 16:29

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.

TBlobField
Da steht, was das Teil kann. Unten stehen weitere Möglichkeiten, sowas wie TSQLBlobStream, TMemoField.

Seiten, die zum Thema beitragen könnten:
https://www.thoughtco.com/storing-re...-field-1057717
http://docwiki.embarcadero.com/CodeE...y.Blobs_Sample
(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.

Ykcim 1. Dez 2020 17:53

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...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:15 Uhr.
Seite 2 von 3     12 3      

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