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 28. Nov 2020, 21:56
Leider konnte ich Deinen Code nicht adaptieren. Obwohl die Autovervollständigung es angibt, meckert der Compiler bei 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
Patrick
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.074 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Image in Blob field (Web-Application)

  Alt 29. Nov 2020, 00:12
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".
  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 29. Nov 2020, 09:19
Leider konnte ich Deinen Code nicht adaptieren. Obwohl die Autovervollständigung es angibt, meckert der Compiler bei 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
  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 30. Nov 2020, 14:51
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!
[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
Angehängte Grafiken
Dateityp: png Logo_Test.png (2,5 KB, 0x aufgerufen)
Angehängte Dateien
Dateityp: txt Logo_LongBlob.txt (9,8 KB, 2x aufgerufen)
Dateityp: txt Logo_LongText.txt (4,9 KB, 2x aufgerufen)
Dateityp: txt Logo_StringField.txt (6,5 KB, 3x aufgerufen)
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 30. Nov 2020, 16:29
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.
  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 1. Dez 2020, 17:53
Vielen Dank, Du hast Dir wirklich viel Mühe gegeben!

Wenn ich noch zu einer Lösung komme, werde ich sie hier posten...
Patrick
  Mit Zitat antworten Zitat
Ykcim

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

AW: Image in Blob field (Web-Application)

  Alt 19. Dez 2020, 23:14
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 WebImageControl1.Base64 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.

Ich habe daher selber ein JSONObject erstellt und dieses dem Service-Aufruf als Parameter mitgegeben. Damit funktioniert es.

Delphi-Quellcode:
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;
Auf der Server-Seite passiert Folgendes:
Delphi-Quellcode:
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;
Auslesen tue ich es mit einem normalen Select und behandle das Ganze wie einen String.

Vielleicht hilft es jemandem weiter.

Vielen Dank für die Unterstützung
Patrick
Patrick

Geändert von Ykcim (20. Dez 2020 um 00:05 Uhr)
  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 04:22 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