Wiord Datei in DB speichern
dani
- php
Hallo zusammen.
Ich habe ein Script, in welchem ein User eine Datei uploaden kann und diese wird anschliessend nicht im Filesystem, sondern in einer MySQL-Datenbank gespeichert.
Dies funktioniert eigentlich gut, auch kann man die Dateien problemlos downloaden.
Leider nur solange es Text-Dateien sind.
Bei Word, .doc funktioniert dies nicht, die Datei kann anschliessend mit dem Word nicht mehr geöffnet werden.
Was muss ich da beachten, dass wenn z.B. eine Word Datei hochgeladen wird ich diese anschliessend auch noch lesen kann?
Besten Dank und Gruss!
PS.: Mit .gif, .pdf, etc. ist es genau das Gleiche.
Hi,
das liegt daran, dass diese Dateien binären Inhalt haben. Bei Binärdaten ist es so, dass diese exakt so kopiert werden müssen, damit die Datei noch einen Sinn ergibt.
Bei Text ist das anders. Hier kann z.B. ein ä unter verschiedenen Zeichensätzen oder verschiedenen Betriebssystemen einen anderen Zeichencode haben. Manchmal werden diese Zeichen dann automatisch umgewandelt, um die Lesbarkeit zu erhalten. Wird dies auch auf eine Binärdatei angewendet, wird diese zerstört.
Weiterhin gibt es so hässliche Sachen wie \0 oder EOF-Character, die eigentlich signalisieren, dass die Datei zuende ist, aber in Wirklichkeit geht sie noch weiter.
Bei PHP habe ich auch schon erlebt, dass "Zeilenumbrüche" (\r oder \n) einfach in Windows-Zeilenumbrüche (\r\n) umgewandelt werden, was eine Binärdatei auch zerstört.
Wenn du noch ein paar mehr Infos bezüglich Einfügen und Auslesen in/aus die/der Datenbank postest, kann man dir Näheres sagen.
Der Yeti
Hi,
Wenn du noch ein paar mehr Infos bezüglich Einfügen und Auslesen in/aus die/der Datenbank postest, kann man dir Näheres sagen.
ich lese die Datei ganz einfach ein mit
$inhalt = file_get_contents($datei);
$inhalt = addslashes($inhalt);
anschliessend das ganze in die DB.
Beim auslesen zurück mit
$inhalt = stripslashes($files["inhalt"]);
Kann ich dies denn irgendwie so übernehmen, dass es funktioniert?
Gruss
echo $begrüßung;
ich lese die Datei ganz einfach ein mit
$inhalt = file_get_contents($datei);
Soweit so gut.
$inhalt = addslashes($inhalt);
Wenn du mit einer SQL-Datenbank "redest", machst du das mit einem Befehl in Text-Form. Wenn du Binärdaten über eine Text-Schnittstelle transportieren möchtest, müssen sie so präpariert (maskiert) sein, dass bestimmte Zeichen nicht als Bestandteil dieses Text-Befehls erkannt werden. addslashes() ist dafür nicht ausreichend. Es behandelt zu wenige Zeichen. Verwende dazu eine zur Datenbank passende Maskier-Funktion. Für MySQL wäre das mysql_real_escape_string().
Außerdem sollte der Feldtyp ein binärer sein, beispielsweise BLOB statt TEXT.
Beim auslesen zurück mit
$inhalt = stripslashes($files["inhalt"]);
Beim Auslesen kommen die Daten nicht mehr über die Text-Schnittstelle der Befehlseingabe. Sie werden in ihrer Roh-Form zurückgeliefert und müssen dann auch nicht wieder demaskiert werden.
Falls du das von deinen Formulardaten her so gewohnt bist - sprich: sie entgegennimmst und "addslashed" in die Datenbank einfügst, und beim Auslesen stripslashes() anwendest, um keine überflüssigen Slashes in der Ausgabe stehen zu haben - liegt das eventuell an einem PHP-Feature namens Magic Quotes.
echo "$verabschiedung $name";