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 20. Dez 2020
Antwort Antwort
Seite 1 von 3  1 23      
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#1

Image in Blob field (Web-Application)

  Alt 24. Nov 2020, 15:26
Datenbank: MySQL • Version: 5 • Zugriff über: FireDac
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
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

AW: Image in Blob field (Web-Application)

  Alt 24. Nov 2020, 19:06
Warum bei 'nem Bild bitte LoadFromJSONStream?

Bilder im JSON-Format?

Vielleich mal einfach nur 'nen Stream laden?

DataModule_Client.DataSet_NewLogo.FieldByName('logo').LoadFromStream(MStream);
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Image in Blob field (Web-Application)

  Alt 24. Nov 2020, 19:34
Das habe ich auch versucht, aber LoadFromStream kennt er angeblich nicht...
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#4

AW: Image in Blob field (Web-Application)

  Alt 24. Nov 2020, 19:59
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

TBlobField(DataModule_Client.DataSet_NewLogo.FieldByName('logo')).SaveToStream(MStream);
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Image in Blob field (Web-Application)

  Alt 24. Nov 2020, 21:38
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
Patrick
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Image in Blob field (Web-Application)

  Alt 24. Nov 2020, 22:31
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.
Heiko

Geändert von hoika (24. Nov 2020 um 22:59 Uhr)
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: Image in Blob field (Web-Application)

  Alt 25. Nov 2020, 17:16
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
Patrick
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Image in Blob field (Web-Application)

  Alt 25. Nov 2020, 18:27
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 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
Patrick
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#9

AW: Image in Blob field (Web-Application)

  Alt 25. Nov 2020, 19:00
Base64 ist doch ein String.
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
  Mit Zitat antworten Zitat
Ykcim

Registriert seit: 29. Dez 2006
Ort: NRW
831 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Image in Blob field (Web-Application)

  Alt 27. Nov 2020, 11:57
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
Patrick
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:23 Uhr.
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