Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Bild in MySQL (Blob) mit mysql.pas speichern (https://www.delphipraxis.net/19823-bild-mysql-blob-mit-mysql-pas-speichern.html)

Morfio 9. Apr 2004 14:50


Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallo,

ich habe jetzt überall gesucht, aber keine Lösung gefunden. Ich benutze die mysql.pas von http://www.fichtner.net/delphi/mysql.delphi.phtml . Nun möchte ich in einer MySQL-Datenbank innerhalb eines Blob-Feldes ein Bild speichern und das auch anzeigen und ändern.

Kennt jemand ein Tutorial, wie man das macht?

Vielen Dank,

Morfio ...

Chewie 9. Apr 2004 16:48

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Zitat:

Zitat von Morfio
Kennt jemand ein Tutorial, wie man das macht?

Nicht konkret zum Speichern von Bildern, aber zum Zugriff via mysql.pas hab ich mal was geschrieben: http://www.delphipraxis.net/internal...l+api+tutorial

Bilder speichern sollte gehen, indem du dein Bild per Stream in einen String umwandelst und diesen via mysql_real_query an die Datenbank schickst.

Morfio 9. Apr 2004 17:11

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hi,

danke für die Antwort. Wie konvertiere ich denn einen TFileStream (ich denke, den brauche ich) in einen String? Finde keine Funktion dafür.

Viele Grüße,

Morfio ...

Chewie 9. Apr 2004 17:40

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Mit dem Filestream öffnest du die Datei und liest die Daten in einen Stringbuffer (via Read).

Morfio 9. Apr 2004 19:55

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallo,

ok, mein Versuch zeigt nichts an, was kann denn daran falsch sein (ich mache das zum ersten Mal):

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TFileStream;
  S: String;
begin
  Stream := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'test.jpg', fmOpenRead or fmShareDenyNone);
  try
    Stream.Read(S, Length(S));
    Memo1.Text := S;
  finally
    Stream.Free;
  end;
end;
Vielen Dank für Eure Hilfe,

Morfio ...

Chewie 9. Apr 2004 20:11

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Versuchs mal so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  Stream: TFileStream;
  S: String;
begin
  Stream := TFileStream.Create('c:\p1.jpg', fmOpenRead or fmShareDenyNone);
  try
    SetLength(s, Stream.Size);
    Stream.Read(S, Stream.Size);
    Memo1.Text := S;
  finally
    Stream.Free;
  end;
end;
Dass du in dem Memo nicht viel siehts, liegt daran, dass irgendwann ein Nullzeichen auftaucht. Windows erkennt so das Ende von Strings und beendet die Ausgabe im Memo.

Morfio 9. Apr 2004 20:24

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hi,

vielen Dank. Jetzt steht im Memo ein (komisches) Zeichen. Ich denke, es funktioniert jetzt. Werde es mal ausprobieren und in einer DB speichern.

Vielen Dank,

Morfio ...

Morfio 10. Apr 2004 12:50

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallo nochmal,

in dem folgenden Abschnitt muß noch irgendwo ein Fehler sein, denn MySQLCC und PHP sagen mir beide, dass das gespeicherte Bild fehlerhaft ist:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Stream: TFileStream;
    S: String;
    query: String;
begin
   Stream := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'test.jpg', fmOpenRead or fmShareDenyNone);
    try
       SetLength(S, Stream.Size);
       Stream.Read(S, Stream.Size);
    finally
       Stream.Free;
    end;
   query := 'INSERT INTO Bild (Name, Bild) VALUES (' + QuotedStr('testbild') + ', ' + QuotedStr(S) + ')';
    mysql_real_query(myCon, PChar(query), Length(query));
end;
Das kann ja eigentlich kein großer Fehler mehr sein. Woran könnte es denn vielleicht noch liegen?

Vielen Dank,

Morfio ...

PS: Das Bild "test.jpg" ist nicht fehlerhaft, IrfanView kann es ohne Probleme vollständig anzeigen.

Chewie 10. Apr 2004 12:55

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Tut mir leid, da muss ich passen. Vergleich doch mal die Dateigröße oder ein MD5- oder CRC-Hash.

Morfio 10. Apr 2004 13:13

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hmm, der liest den Stream per Read gar nicht ein. Was er in die Datenbank schreibt ist einfach nur ein leerer String. Die Funktion Read muss an der Stelle irgendwie falsch sein.

Chewie 10. Apr 2004 13:32

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Was ist die Rückgabe von Read (=die Anzahl der gelesenen Bytes)?

Morfio 10. Apr 2004 13:43

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Die entspricht der genauen Größe der Datei.

Chewie 10. Apr 2004 13:53

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Dann hat er die richtige Anzahl Zeichen gelesen.

Warum das Schreiben in die DB aber nicht funktioniert, weiß ich auch nicht :|

mfichtner 24. Apr 2004 01:27

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Zitat:

Zitat von Morfio
Nun möchte ich in einer MySQL-Datenbank innerhalb eines Blob-Feldes ein Bild speichern und das auch anzeigen und ändern.

Für Delphi hab' ich zwar gerade keinen Beispiel-Code parat, aber ich hab' was vergleichbares mal für TMT Pascal geschrieben:

http://www.fichtner.net/tmt/mysql/

Die Beispiele in mysql-blobs-1.0-tmt.zip müßten im Prinzip ohne allzu große Änderungen auch in Delphi compilierbar sein. Aber selbst wenn das nicht auf Anhieb klappt: Der Code zeigt auf jeden Fall, wie man ein JPG-Bild in einem Blob-Feld speichert und es wieder ausliest.

Hope this help. :)

Mannoman 1. Mai 2004 21:44

Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Ich habe mal Bilder in einer Datenbank gespeichert. Statt OpenPictureDialog kann man natürlich auch einen Pfad und den Namen des Bildes angeben. Folgende Prozedur:
Delphi-Quellcode:
procedure TF_Formblaetter.FileOpenItemClick(Sender: TObject);
var   FS: TFileStream;
begin
if OpenPictureDialog1.Execute then begin
      Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
      DataModul.Presentation.Edit;
      FS := TFileStream.Create(OpenPictureDialog1.FileName, fmOpenRead);
      try
         DataModul.PresentationLogo.LoadFromStream(FS);
      finally
         FS.Free;
      end;
      DataModul.PresentationLogoname.AsString := OpenPictureDialog1.FileName;
      DataModul.Presentation.Post;
   end else
Image1.Picture:= nil;
end;
[edit=Sharky]Dephi-Tags gesetzt. Mfg, Sharky[/edit]

jus 16. Dez 2019 23:30

AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Zitat:

Zitat von mfichtner (Beitrag 145283)
Zitat:

Zitat von Morfio
Nun möchte ich in einer MySQL-Datenbank innerhalb eines Blob-Feldes ein Bild speichern und das auch anzeigen und ändern.

Für Delphi hab' ich zwar gerade keinen Beispiel-Code parat, aber ich hab' was vergleichbares mal für TMT Pascal geschrieben:

http://www.fichtner.net/tmt/mysql/

Die Beispiele in mysql-blobs-1.0-tmt.zip müßten im Prinzip ohne allzu große Änderungen auch in Delphi compilierbar sein. Aber selbst wenn das nicht auf Anhieb klappt: Der Code zeigt auf jeden Fall, wie man ein JPG-Bild in einem Blob-Feld speichert und es wieder ausliest.

Hope this help. :)

sorry dass ich den alten Beitrag ausgrabe, aber hat jemand die obige mysql-blobs-1.0-tmt.zip irgendwo rumliegen? Ich habe die Fichtner mysql.pas im Einsatz und hätte gerne gewußt wie Fichtner Blob über mysql.pas blob Dateien zur DB schickt.

lg,
jus

jus 21. Feb 2020 10:41

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
*push*
hat wer noch die mysql-blobs-1.0-tmt.zip von Fichtner MySQL rumliegen?

himitsu 21. Feb 2020 11:13

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Leider hat er/sie die Datei nicht hier angehängt
und unglücklicher Weise bist du zwei Monate zu spät dran. (Webseite ist wegen gewisser Umstände offline)

Falls es extrem wichtig ist:
https://www.fichtner.net/ und auch http://fichtner-meyer.com (URL von dessen eMail)
Zitat:

Brigitte Fichtner
geb. Nauck

* 6. Februar 1938 † 22. Dezember 2019
Wobei ... M oder B ... wenn es ihr Mann war (wobei Männer ja durchschnittlich vor ihren Frauen sterben).
Weil auf der Webseite nix mehr steht ... mal Denic fragen wo der Ansprechpartner erreichbar ist, denn "irgendwer" hatte ja die Webseite anschließend noch geändert und womöglich hat derjenige Zugriff auf den Computer wo die Quellcodes liegen.

Leider hat auch das Webarchive noch keine Kopie der ZIP (nach Juli 2007 war diese Untereite schon weg)
http://web.archive.org/web/200704050...net/tmt/mysql/

Zitat:

applications developed in TMT Pascal
Und falls wer das erwähnte TMT aus der archivierten Webseite sucht ... diese Seite wurde inzwichen auch umbenannt/verkauft.
http://web.archive.org/web/200704050...//www.tmt.com/
http://www.frameworkpascal.com/

[edit]
Hast du ein Glück ... eine ältere Version gibt es.
Hast du ein Prech ... eine ältere Version gibt es doch nicht. (Archiviert als text/html: Got an HTTP 302 response at crawl time)
http://web.archive.org/web/*/http://...et/tmt/mysql/*

hoika 21. Feb 2020 11:54

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallo,
einfach mal Google benutzen ...

Ergibt u.a.
https://stackoverflow.com/questions/...per-for-delphi

Na, ich mal nicht so sein
http://www.audio-data.de/mysql.html

jus 21. Feb 2020 14:10

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
@hoika: vielen Dank fürs Raussuchen, die Links kenne ich, aber leider ist der BLOB Ansatz im aktuellen mysql.pas nicht enthalten.

vielen Dank für eure Mühen, ich hatte bereits im letzten Dezember auch schon im http://web.archive.org geschaut, aber leider keinen funktionierenden Downloadlink gefunden. Meine letzte Hoffnung ist, dass jemand es noch auf seiner Festplatte rumliegen hat. Also falls jemand den Ansatz mit dem BLOB in Verbindung mit der Fichtner MySQL.pas hat, dass bitte melden. :cyclops:

hoika 21. Feb 2020 14:33

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallo,
ah, Lesefehler.
Ich würde statt dem String einen TStringStream benutzen.

Datei -> TFileStream -> TStringStream -> TStringStream.DataString enthält dann die Datei.

PS1: Du solltest auch Stream.Size mal prüfen, das sollte einen Wert > 0 haben.
PS2: FileStream.Position vor allen Aktionen auf 0 setzen (Vielleicht ist das bei Deinem alten Code schon die Lösung).

haentschman 21. Feb 2020 14:45

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallöle...8-)
Nur aus Neugier...was hat die Fichtner MySQL.pas anders als andere (FireDAC etc.) Blob ist Blob. Oder?

hoika 21. Feb 2020 14:53

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hall,
die Fichtner-Version ist älter,
damit sind wahrscheinlich so etliche MySQL-Anbindungen in Delphi programmiert worden.

17-Aug-1999 mf Translated mysql.h MySQL 3.22.24

samso 21. Feb 2020 15:40

AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Zitat:

Zitat von Morfio (Beitrag 139012)
Hallo nochmal,

in dem folgenden Abschnitt muß noch irgendwo ein Fehler sein, denn MySQLCC und PHP sagen mir beide, dass das gespeicherte Bild fehlerhaft ist:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
   Stream: TFileStream;
    S: String;
    query: String;
begin
   Stream := TFileStream.Create(ExtractFilePath(ParamStr(0)) + 'test.jpg', fmOpenRead or fmShareDenyNone);
    try
       SetLength(S, Stream.Size);
       Stream.Read(S, Stream.Size);
    finally
       Stream.Free;
    end;
   query := 'INSERT INTO Bild (Name, Bild) VALUES (' + QuotedStr('testbild') + ', ' + QuotedStr(S) + ')';
    mysql_real_query(myCon, PChar(query), Length(query));
end;
Das kann ja eigentlich kein großer Fehler mehr sein. Woran könnte es denn vielleicht noch liegen?

Vielen Dank,

Morfio ...

PS: Das Bild "test.jpg" ist nicht fehlerhaft, IrfanView kann es ohne Probleme vollständig anzeigen.

Probiere mal "QuoteString" aus der mysql.pas statt QuotedStr.

Benutzt Du noch eine ältere Delphi-Version(<=Delphi 2007)?

himitsu 21. Feb 2020 16:57

AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Das QuoteStr von Delphi war sowieso noch niemals für SQL vorgesehen, denn es arbeitet nach Standard der Pascal-Strings, also behandelt ausschließlich das '
und vor allem ein \ oder Steuerzeichen machen danach weiterhin viel Spaß.

Außerdem wird es hier ab Delphi 2009 schön knallen, wenn man Binärdaten in einen String/UnicodeSting packt, denn Dabei werden natürlich Bytes verändert, entsprechend der aktuellen Systemsprache (ANSI>Unicode)
https://www.delphipraxis.net/203328-...ifizieren.html

haentschman 22. Feb 2020 07:11

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Moin...:P
Zitat:

die Fichtner-Version ist älter
Aus welchem Grund kommt ein Umstieg auf was Aktuelles nicht in Frage? :gruebel:

hoika 22. Feb 2020 07:40

AW: Bild in MySQL (Blob) mit mysql.pas speichern
 
Hallo,
Zitat:

Aus welchem Grund kommt ein Umstieg auf was Aktuelles nicht in Frage?
Das war nur der erste Eintrag im Changelog.
Ich wollte damit zeigen, dass bereits so früh begonnen hatte.

jus 27. Feb 2020 00:32

AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
 
Ich habe es nun mit einem Prepared Statement gelöst. Für den Fall, dass jemand auch das mal braucht, das folgende Beispiel basiert auf das Prepared Statement Demo "StmtDemo", das im aktuellen mysql.pas ZIP dabei ist.
Delphi-Quellcode:
procedure TForm1.Button3Click(Sender: TObject);
var
  stmt: PMYSQL_STMT;
  bind: PMYSQL_BIND;
  affected_rows: my_ulonglong;
  param_count: Integer;
  InsertQuery: String;
  fs: TFileStream;
  data: array of byte;
  filesize: Int64;
begin
  Memo.Lines.Add('mysql_stmt_init()');
  stmt := mysql_stmt_init(LibHandle);
  if (stmt=nil)
  then begin
    Memo.Lines.Add('mysql_stmt_init(), out of memory');
    exit;
  end;
  Memo.Lines.Add('mysql_stmt_init() done');

  InsertQuery := 'INSERT INTO testblob(filedata) VALUES(?)';

  Memo.Lines.Add('mysql_stmt_prepare()');
  if (mysql_stmt_prepare(stmt, PAnsiChar(InsertQuery), Length(InsertQuery))<>0)
  then begin
    Memo.Lines.Add('mysql_stmt_prepare(), INSERT failed');
    Memo.Lines.Add(mysql_stmt_error(stmt));
  end;
  Memo.Lines.Add('mysql_stmt_prepare() done');

  Memo.Lines.Add('mysql_stmt_param_count()');
  param_count := mysql_stmt_param_count(stmt);
  Memo.Lines.Add(Format('total parameters in INSERT: %d', [param_count]));
  if (param_count <> 1)
  then begin
    Memo.Lines.Add('invalid parameter count returned by MySQL');
    exit;
  end;

  bind := mysql_bind_init(1); //** Different to org. Demo: Alloc 3 MYSQL_BIND **
  try
    fs := TFileStream.Create('TestDatei1.txt',fmOpenRead);
    try
      SetLength(data,fs.Size);
      fs.ReadBuffer(data[0],fs.Size);
      filesize := fs.Size;
    finally
      fs.Free;
    end;

    mysql_bind_set_param(bind, 0, MYSQL_TYPE_BLOB, @data[0], filesize, @filesize, nil);
    Memo.Lines.Add('mysql_stmt_bind_param()');
    if mysql_stmt_bind_param(stmt, bind)
    then begin
      Memo.Lines.Add('mysql_stmt_bind_param() failed');
      Memo.Lines.Add(mysql_stmt_error(stmt));
      exit;
    end;
    Memo.Lines.Add('mysql_stmt_bind_param() done');

    Memo.Lines.Add('mysql_stmt_execute()');
    if (mysql_stmt_execute(stmt)<>0)
    then begin
      Memo.Lines.Add('mysql_stmt_execute() failed');
      Memo.Lines.Add(mysql_stmt_error(stmt));
      exit;
    end;
    Memo.Lines.Add('mysql_stmt_execute() done');
    affected_rows := mysql_stmt_affected_rows(stmt);
    Memo.Lines.Add(Format('total affected rows(insert 2): %u', [affected_rows]));
    if (affected_rows <> 1)
    then begin
      Memo.Lines.Add('invalid affected rows by MySQL');
      exit;
    end;

  finally
    FreeMem(bind);
  end;
  if mysql_stmt_close(stmt)
  then begin
    Memo.Lines.Add('failed while closing the statement');
    Memo.Lines.Add(mysql_stmt_error(stmt));
    exit;
  end;
end;
Wobei die testblob Tabelle wie folgt ausschaut:
Code:
CREATE TABLE `testblob` (
  `id` int(11) NOT NULL auto_increment,
  `filename` varchar(200) default NULL,
  `filesize` int(11) default NULL,
  `filedata` longblob,
  PRIMARY KEY (`id`));
Zitat:

Zitat von samso (Beitrag 1458064)
Benutzt Du noch eine ältere Delphi-Version(<=Delphi 2007)?

ja, bei diesem Projekt immer noch Delphi 2007.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:10 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