Bilder in Datenbank übergeben



  • Hallo,

    ich lese in meiner Anwendung aus zwei Edit- Feldern Name und Vorname aus. Diese Werte werden dann mit einem Insert Befehl in eine MySQL Datenbank übergeben. Nun möchte ich zum jeweiligen Eintrag auch ein Bild dazu abspeichern.
    Dazu habe ich die Tabelle um die Spalte "IMG" erweitert und den Typ "Mediablob" zugewiesen.
    Welche Komponente eignet sich nun zum Hinzufügen des Bildes in die Tabelle, TDBImage, oder doch nur TImage?
    Wie muss die Insert Query ergänzt werden, damit Name, Vorname und Bild in die Datenbank geschrieben werden?
    Aktuell sieht der wie folgt aus:
    "INSERT INTO personen (name, vorname) VALUES (' "+Edit1->Text+" ', ' "+Edit2->Text+" ')"
    Oder macht es mehr Sinn nur den Link zum Bild zu speichern? -> Falls ja wie?
    Danke schon mal für eure Unterstützung!!



  • @jevo sagte in Bilder in Datenbank übergeben:

    Wie muss die Insert Query ergänzt werden, damit Name, Vorname und Bild in die Datenbank geschrieben werden?
    Aktuell sieht der wie folgt aus:
    "INSERT INTO personen (name, vorname) VALUES (' "+Edit1->Text+" ', ' "+Edit2->Text+" ')"

    Ich weiss nicht wie du mit VCL Bilder in eine Datenbank einfügen kannst. Ich würde aber damit anfangen das ganze erstmal gegen SQL Injection abzusichern.



  • Mit der Image Komponente sollte das doch möglich sein, dass ich zuerst ein Bild lade und es dann mit ner SQL Abfrage in die Datenbank schreibe.

    Da dies nur für mein eigenes Projekt genutzt werden soll, lasse ich mal Sicherheitsstandards unberücksichtigt... 🙂



  • @jevo

    1. Das, was hustbär sagt. Mach dich mal über Prepared Statements schlau und benutz´ die dann statt eines rohen String-Kommandos

    2. Wie groß sind die Bilder und wie viele werden das in etwa? Wenn du nur einige Thumbnails in der db ablegen willst ist das vermutlich kein Problem, aber wenn du viele große Bilder speichern willst ist es wahrscheinlich besser, die Bilder auf einem Fileserver abzulegen und in der db lediglich den Pfad zu den einzelnen Bildern abzulegen.
      Fast alle VCL Image Komponenten haben eine SaveToStream Methode, mit der du Bilddaten zB in einen MemoryStream schreiben kannst. Dessen Inhalt kannst du dann per mysql_real_escape_string kodieren (oder der passenden Funktion, kenne mich mit der mySQL C-API nicht aus) und in die db schreiben. Beim Lesen musst du dann die entsprechende Umkehrfunktion benutzen.



  • Binärdaten werden auch üblicherweise über Parameter übergeben und nicht als Text in die Query mit reinformatiert. Von daher: ja, schau dir Prepared Statements an.
    (Man kann BLOBs auch z.B. hex-kodiert einfügen, aber das sollte man sich gar nicht erst angewöhnen.)

    Ansonsten gibt es bei MySQL wohl noch die LOAD_FILE Funktion: INSERT INTO personen (name, vorname, bild) VALUES ('Mustermann', 'Max'', LOAD_FILE('C:\Path\To\File.jpg')). Dabei muss das File halt auf dem DB-Server liegen, was bei einer Client/Server Anwendung oft nicht passt.



  • @DocShoe
    Danke für deine Rückmeldung.
    Zunächst soll es sich mal um ein Bild handeln max. rund 3 MB. Für die Zukunft wäre es aber sicher angebrachter sich die Sachen mit der Save_to_Stream Methode zu verinnerlichen.
    Leider habe ich die Methode noch nie angewendet, gibt es dazu irgendwo Beispiele?



  • @hustbaer
    Ich denk für einen ersten Test werde ich das mal so versuchen.
    Aber die Methode SaveToStream sollte für die Zukunft verwendet werden, da man schnell mal den Wunsch hat auch mehr als ein Bild abzuspeichern!



  • @jevo
    Hast du vor, mehr als ein Bild in den Stream zu schreiben und das dann als ein Eintrag in der db abzulegen? Falls ja: Wie handhabst du das dann, wenn ein Bild gelöscht/ersetzt werden soll?



  • @DocShoe
    Die Bilder sollen nicht ersetzt / gelöscht werden!



  • Wenn es mehr als ein Bild werden soll, dann wäre mMn. eine Detailtabelle angesagt. Natürlich kann man auch mehrere Files in einen Stream schreiben. Nur dann braucht man wieder irgend ein Containerformat (zip, tar, ...). Macht's auch nicht einfacher. Und wozu wenn man eh schon eine Datenbank hat?

    Die Bilder sollen nicht ersetzt / gelöscht werden!

    Ich kann mir kaum eine Anwendung vorstellen bei der man sinnvoll sagen kann dass abgespeicherte Bilder nie gelöscht oder ersetzt werden müssen.


Log in to reply