Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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

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.

@Frank: thx!

@dr.disk: thx ebenfalls!

Gruß

Azrael

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

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

@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

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.

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

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.

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

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

Doku angeschaut! :D :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

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

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.

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

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

@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

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

@estahn:

thx

Azrael

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.