![]() |
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 ![]() Kennt jemand ein Tutorial, wie man das macht? Vielen Dank, Morfio ... |
Re: Bild in MySQL (Blob) mit mysql.pas speichern
Zitat:
![]() Bilder speichern sollte gehen, indem du dein Bild per Stream in einen String umwandelst und diesen via mysql_real_query an die Datenbank schickst. |
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 ... |
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).
|
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:
Vielen Dank für Eure Hilfe,
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; Morfio ... |
Re: Bild in MySQL (Blob) mit mysql.pas speichern
Versuchs mal so:
Delphi-Quellcode:
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.
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; |
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 ... |
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:
Das kann ja eigentlich kein großer Fehler mehr sein. Woran könnte es denn vielleicht noch liegen?
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; Vielen Dank, Morfio ... PS: Das Bild "test.jpg" ist nicht fehlerhaft, IrfanView kann es ohne Probleme vollständig anzeigen. |
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.
|
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.
|
Re: Bild in MySQL (Blob) mit mysql.pas speichern
Was ist die Rückgabe von Read (=die Anzahl der gelesenen Bytes)?
|
Re: Bild in MySQL (Blob) mit mysql.pas speichern
Die entspricht der genauen Größe der Datei.
|
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 :| |
Re: Bild in MySQL (Blob) mit mysql.pas speichern
Zitat:
![]() 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. :) |
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:
[edit=Sharky]Dephi-Tags gesetzt. Mfg, Sharky[/edit]
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; |
AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
Zitat:
lg, jus |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
*push*
hat wer noch die mysql-blobs-1.0-tmt.zip von Fichtner MySQL rumliegen? |
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: ![]() ![]() Zitat:
Weil auf der Webseite nix mehr steht ... mal ![]() Leider hat auch das Webarchive noch keine Kopie der ZIP (nach Juli 2007 war diese Untereite schon weg) ![]() Zitat:
![]() ![]() [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) ![]() |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Hallo,
einfach mal Google benutzen ... Ergibt u.a. ![]() Na, ich mal nicht so sein ![]() |
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 ![]() |
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). |
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? |
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 |
AW: Re: Bild in MySQL (Blob) mit mysql.pas speichern
Zitat:
Benutzt Du noch eine ältere Delphi-Version(<=Delphi 2007)? |
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) ![]() |
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Moin...:P
Zitat:
|
AW: Bild in MySQL (Blob) mit mysql.pas speichern
Hallo,
Zitat:
Ich wollte damit zeigen, dass bereits so früh begonnen hatte. |
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
![]()
Delphi-Quellcode:
Wobei die testblob Tabelle wie folgt ausschaut:
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;
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:
|
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