A.Z.R.A.E.L. Geschrieben 16. März 2003 Geschrieben 16. März 2003 Hi! Hab mal wieder eine Frage: Ich müsste eine Datei (txt,html,pdf,jpg,gif,doc,mpg usw) über PHP in eine MySql - Datenbank speichern! (NICHT DEN LINK!!!!!!) Dafür hätte ich eine Spalte als LONGBLOB definiert. Nach dem Speichern in der Datenbank sollte ein Downloadlink angezeigt werden. bei Klick auf dem Link soll ein PHP-Script ausgeführt werden dass den Wert des BLOB - Feldes holt (also die gespeicherte Datei) und herunterlädt. Hat jemand von euch sowas schon mal gemacht?? Oder könnte mir jemand mal das komplette BLOB Handling in Verbindung mit MySQL+PHP erklären??? Danke Azrael Zitieren
robotto7831a Geschrieben 16. März 2003 Geschrieben 16. März 2003 Hallo schau mal hier und hier. Frank Zitieren
dr.disk Geschrieben 16. März 2003 Geschrieben 16. März 2003 Sowas hab ich schon gebaut. Infos und vor allem Beispiele findest Du hier: www.hotscripts.com. Noch ein Tip: ich empfehle Dir die Blobs in einer Tabelle zu speichern die zusätzlich nur eine ID besitzt. Die Verknüpfung zu den anderen Daten wird über eine 1:1-Beziehung hergestellt. Bei mir sind massive Performance-Probleme aufgetreten die durch diese Änderung am Datenbankendesign verschwunden sind. Zitieren
A.Z.R.A.E.L. Geschrieben 17. März 2003 Autor Geschrieben 17. März 2003 @Frank: thx! @dr.disk: thx ebenfalls! Gruß Azrael Zitieren
A.Z.R.A.E.L. Geschrieben 19. März 2003 Autor Geschrieben 19. März 2003 Ok Ich habs jetzt mal getestet bei mir! Teilweise sogar mit großen Erfolg! Teilweise deswegen, weil bei Dateien >= 1 MB ist Schluss mit dem INSERT!!!!! :( Gibts da noch Alternativen??? Gruß Azrael Zitieren
Jaraz Geschrieben 19. März 2003 Geschrieben 19. März 2003 Hi, 16.3. Ist es sinnvoll, Bilder in einer Datenbank abzulegen? http://www.dclp-faq.de/q/q-db-blob.html 28.3. Fatal error: Maximum execution time exceeded http://www.dclp-faq.de/q/q-fehler-maximum-time.html Ich würde die Datei im Dateisystem ablegen und nur den Pfad speichern. So brauchst du nur ein Skript, das die Links erzeugt. Das liefern von Binärdaten aus Mysql ist bis zu 10 mal langsamer als das direkte lesen von Platte. Gruß Jaraz Zitieren
A.Z.R.A.E.L. Geschrieben 19. März 2003 Autor Geschrieben 19. März 2003 @Jaraz Bin auch davon (jetzt besonders!) überzeugt, dass das Speichern von binären Daten in ner Datenbank einfach Schwachsinn ist!!! Nur leider dachte mein Lehrer (und Projektleiter) ich solls mit BLOBs machen... Na ja, ich denke, dass es mir jetzt wirklich nicht schwer fallen sollte ihn zu überzeugen! Gruß Azrael Zitieren
estahn Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by A.Z.R.A.E.L. Ok Ich habs jetzt mal getestet bei mir! Teilweise sogar mit großen Erfolg! Teilweise deswegen, weil bei Dateien >= 1 MB ist Schluss mit dem INSERT!!!!! Gibts da noch Alternativen??? Gruß Azrael Das Problem liegt an der Größe des Querys, diese dürfen nur bis zu 64KB groß sein (kann auch etwas größer oder kleiner sein). Abhilfe schafft da die Funktion LOAD_FILE() z.B. INSERT INTO `tabelle` SET filecontent=LOAD_FILE('/tmp/paper.pdf'); Originally posted by A.Z.R.A.E.L. @Jaraz Bin auch davon (jetzt besonders!) überzeugt, dass das Speichern von binären Daten in ner Datenbank einfach Schwachsinn ist!!! Nur leider dachte mein Lehrer (und Projektleiter) ich solls mit BLOBs machen... Na ja, ich denke, dass es mir jetzt wirklich nicht schwer fallen sollte ihn zu überzeugen! Gruß Azrael Wie immer ist es kein genereller "Schwachsinn" binäre Daten in eine Datenbank abzulegen. Die oben genannte FAQ vom Herrn Köhntop ist schon etwas älter und es befinden sich auch einige Ungenauigkeiten darin. Wenn Du eine Internetseite oder ein Forum erstellt ist es wie gesagt sinnvoll die Dateien in das Dateisystem auszulagern, weil die Perfomance sonst ziemlich in die Knie geht. Es gibt aber auch einige Gründe die binären Daten in der Datenbank zu behalten. Zitieren
Jaraz Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by estahn Das Problem liegt an der Größe des Querys, diese dürfen nur bis zu 64KB groß sein (kann auch etwas größer oder kleiner sein). Ich würde eher sagen, es liegt an den Variable/n: max_allowed_packet oder bei file upload an: post_max_size upload_max_filesize Gruß Jaraz Zitieren
estahn Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by Jaraz Ich würde eher sagen, es liegt an den Variable/n: max_allowed_packet oder bei file upload an: post_max_size upload_max_filesize Gruß Jaraz an max_allowed_packet kann es auch liegen, aber ein query ist trotzem in seiner größe beschränkt ;-) php hat 2mb per default. Zitieren
Jaraz Geschrieben 24. März 2003 Geschrieben 24. März 2003 Originally posted by estahn aber ein query ist trotzem in seiner größe beschränkt ;-) Ja, sogar genau 1MB 1048574 Byte Also erst query anpassen und wenn es dann immer noch nicht klappt, mal die Variablen überprüfen. Zu der allgemeinen BLOB Verwendung. Ich habe auch BLOB Spalten in meinen Datenbanken. Aber alles was bereits als Datei vorliegt, bleibt auch eine Datei. Gruß Jaraz Zitieren
A.Z.R.A.E.L. Geschrieben 24. März 2003 Autor Geschrieben 24. März 2003 Hi! Also meine Meinung was Blobs angeht hat sich jetzt geändert! *GG* Habs auch hinbekommen (mit LOAD_FILE())!! Bei mir hats an max_allowed_packet und an MAX_FILE_SIZE beim Browser gelegen! :D Eine Frage hätte ich allerdings noch: bei MySQL 3.23 was ist der Maximalwert für max_allowed_packet??? Gruß Azrael Zitieren
Jaraz Geschrieben 24. März 2003 Geschrieben 24. März 2003 Gucks Du Doku. http://www.mysql.com/doc/en/Packet_too_large.html also 16M Gruß Jaraz Zitieren
A.Z.R.A.E.L. Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Doku angeschaut! :D Nur: Ein LONGBLOB - Feld kann ja über 1 GB fassen oder?? Wie kann ich da mit LOAD_FILE() dann über 16 MB reinbekommen??? Gruß Azrael Zitieren
Jaraz Geschrieben 25. März 2003 Geschrieben 25. März 2003 Originally posted by A.Z.R.A.E.L. Doku angeschaut! :D Nur: Ein LONGBLOB - Feld kann ja über 1 GB fassen oder?? Gute Frage. Kann man auch bei 3.23.x mehr als 16 MB in ein LONGBLOB speichern? Da bei 4.X max_allowed_packet ja größer sein kann. Gruß Jaraz Zitieren
estahn Geschrieben 25. März 2003 Geschrieben 25. März 2003 Originally posted by Jaraz Gute Frage. Kann man auch bei 3.23.x mehr als 16 MB in ein LONGBLOB speichern? Da bei 4.X max_allowed_packet ja größer sein kann. Gruß Jaraz wenn in der doku nix weiter steht dann gehts auch nicht. ausser es ist undokumentiert :-) ansonsten musst du die datei stückeln und die teile einzeln hochladen. insert into `tabelle` set filecontent=concat_ws('', filecontent, LOAD_FILE(...)); ich hoffe ist so richtig, hab jetzt nur aus dem kopf was dahingeschmiert. grundkonzept sollte aber klar sein. (teil1 + teil2 + ... + teil n = gesamt) so long. Zitieren
A.Z.R.A.E.L. Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 Also: Doku sagt nix ob in 3.23 oder in 4.x mehr als 16 MB in das Blob - Feld gespeichert werden kann... Es wird nur gesagt,dass ein LONGBLOB L+4 Bytes, wobei L < 2^32 hat! siehe hier Gruß Azrael Zitieren
estahn Geschrieben 25. März 2003 Geschrieben 25. März 2003 Originally posted by A.Z.R.A.E.L. Also: Doku sagt nix ob in 3.23 oder in 4.x mehr als 16 MB in das Blob - Feld gespeichert werden kann... Es wird nur gesagt,dass ein LONGBLOB hat! siehe hier Gruß Azrael i know, ich kenn die doku fast auswenig ;-) Zitieren
A.Z.R.A.E.L. Geschrieben 25. März 2003 Autor Geschrieben 25. März 2003 @estahn Heißt das jetzt das ein LONGBLOB bei beiden Versionen gleich groß ist?? also ca. 4 GB (wenn ich mich nicht verrechnet hab :D ) noch was: Hab zwar kapiert was du mit dem zerstückeln, meinst aber die syntax von dem Insert hab ich nicht so gaaanz kapiert! Thx Azrael Zitieren
estahn Geschrieben 26. März 2003 Geschrieben 26. März 2003 Originally posted by A.Z.R.A.E.L. @estahn noch was: Hab zwar kapiert was du mit dem zerstückeln, meinst aber die syntax von dem Insert hab ich nicht so gaaanz kapiert! Thx Azrael insert into `tabelle` set filecontent=concat_ws('', filecontent, LOAD_FILE(...)); filecontent = spaltenname concat_ws führt 2 strings mittels einem trennzeichen zusammen das trennzeichen hier ist '', also es gibt keins. must du mal probieren ob das geht, war nur so eine spontane idee. enrico Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.