php-icon

Bilder in der Datenbank speichern

Neben der Möglichkeit Bilder (oder generell Datein) auf dem Webserver zu speichern gibt es auch noch die Möglichkeit diese in der Datenbank zu speichern. Vor- und Nachteile dieser Möglichkeit und wie das ganze an einem Beispiel funktioniert erfahrt Ihr in diesem Artikel.

Vor- und Nachteile

Vor- und Nachteile beim speichern in eine Datei:

Vorteile Nachteile
Hier ist sicherlich ein großer Vorteil dass Bilder direkt ohne ein Scripte aufgerufen werden können. Des weiteren belastet es nur die HDD und nicht den SQL Server. Der genannte Vorteil mit dem Direktaufruf kann sich aber auch sehr schnell zu einem Nachteil entwickeln. Hat man ein Bild in dem sich ein Schadenscode versteckt auf der Festplatte, ist es nur eine Frage der Zeit bis eine Remote-File-Injection versucht wird.

Vor- und Nachteile beim speichern in der Datenbank:

Vorteile Nachteile
Ein großer Vorteil: für Backups muss nur die Datenbank gesichert werden. Ein weiterer Vorteil ist, man könnte Bilder auch mit GZIP in der Datenbank speichern. Ein großer Nachteil ist, dass der SQL Server sehr schnell ausgelastet wird wenn es sich um einen Billig-Hoster oder einen schlechten Server handelt.

Der BLOB

Welche Datenbanktypen brauchen wir also nun um eine Datein in der Datenbank zu speichern?
MySQL bietet und dafür sogenannte BLOB-Typen (Näheres hier – Die Spaltentypen BLOB und TEXT). Jeder BLOB-Typ kann verschieden große Datein speichern:

Typ Größe
TINYBLOB Bis 256 Byte
BLOB Bis 65 KB
MEDIUMBLOB Bit 16 MB
LONGBLOB Bis 4 GB

Ich werde im Beispiel einen MEDIUMBLOB mit einer maximalen zulässigen Größe von 16Mb verwenden.

Was ist zu beachten

Bevor ich anfange Code zu veröffentlichen hier noch ein Hinweis:

  • Solltet ihr den Fehler „MySQL has gone away“ beim ausführen des SQL-Query erhalten, so liegt es daran das euere MySQL-Variable max_allowed_packet in der my.ini zu „klein“ eingestellt ist. Dieser Variable gibt an wie groß SQL-Querys sein dürften, der Standart Wert ist meißt 1MB. Solltet ihr also versuchen Datein größer als 1MB in die Datenbank zu speichern, so denkt daran den Wert der Variable auf den jeweiligen BLOB anzupassen (für MEDIUMBLOB dann also 16M).

Der Code

Quellcode   
<?php
// Datei auslesen
$content  = file_get_contents('test.jpg');
// Datei für Datenbank sichern
$content  = mysql_real_escape_string($content);
// Datei komprimieren
$content  = gzcompress($content,9);
// Datenbankverbindung herstellen
$mysqli   = new mysqli('localhost', 'USER', 'PASSWORD', 'DATABASE');
// Datei in Datenbank einfügen
$mysqli->query("INSERT INTO `table` (`id`, `data`) VALUES (NULL,'".$content."');");
// Datenbankverbindung schließen
$mysqli->close();
?>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Time limit is exhausted. Please reload the CAPTCHA.