Hallo und guten Morgen,
Ich möchte eine Datei in einer mysql Datenbank abspeichern.
if(is_uploaded_file ( $_FILES['formular_datei']['tmp_name'] )) { $datei_size=filesize($_FILES['formular_datei']['tmp_name']); $datei=fopen($_FILES['formular_datei']['tmp_name'],'r'); $data=addslashes(fread( $datei, $datei_size)); $sql="INSERT INTO doku (datei) values ('$data')"; $das_wars = mysql_query($sql); }
Das Ergebniss ist leider in der Datenbank ein leeres Feld: [BLOB - 0 B]
was mache ich da falsch?
Schau Dir mal den Unterschied zwischen addslashes() und mysqli_real_escape_string() an, welche Bytewerte ("Zeichen" wäre hier mMn nicht richtig) da escaped werden.
Da Du die Datei über die Textschnittstelle von MySQL übergibst, die ja bekanntlich Daten und Befehle mischt, musst Du die Daten auch für diese Textschnittstelle vorbereiten, damit eben nicht einzelne Bytewerte dazu führen, dass die Textschnittstelle sie (und nachfolgende) als Befehl auffasst.
Umgehen kannst Du das mit "prepared Statements". Dort werden die Werte vom Programm ins Statement eingebaut. Und das kümmert sich dann auch um das Escaping.
Beim Hochladen von Dateien solltest Du auf jeden Fall darauf achten, dass diese auf dem Server nicht (ungeprüft) in einem per HTTP/s zugänglichen Pfad landen. Außerdem solltest Du keine von Usern vorgeschlagenen Dateinamen (ungeprüft) übernehmen. Besser ist immer ein auf dem Server generierter ungefährlicher Dateiname.
Du würdest dir sonst eine Sciherheitslücke in deinen Server reißen. Es könnten Skripte dabei sein oder wichtige Dateien überschrieben werden.
Grüße
TS