Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

Geschrieben

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.

Geschrieben

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

Geschrieben

@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

Geschrieben
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.

Geschrieben
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

Geschrieben
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.

Geschrieben
Originally posted by estahn

aber ein query ist trotzem in seiner größe beschränkt ;-)

Ja, sogar genau 1MB :rolleyes:

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

Geschrieben

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 :D :D

Eine Frage hätte ich allerdings noch:

bei MySQL 3.23 was ist der Maximalwert für max_allowed_packet???

Gruß

Azrael

Geschrieben
Originally posted by A.Z.R.A.E.L.

Doku angeschaut! :D :D

Nur: Ein LONGBLOB - Feld kann ja über 1 GB fassen oder??

Gute Frage. :D

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

Geschrieben
Originally posted by Jaraz

Gute Frage. :D

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.

Geschrieben
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 ;-)

Geschrieben

@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 :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

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...