IT-Academy Logo
Sign Up Login Help
Home - Programmieren - PHP - PHP: Dateien in mySQL-Tabelle speichern



PHP: Dateien in mySQL-Tabelle speichern

Dieser Artikel soll zeigen, wie man verschiedene Dateien in einer mySQL Tabelle speichert und diese dann bei Bedarf wieder ausliefert. Dies geht komplett ohne einen BLOB.


Autor: Goe rgi (Goergi)
Datum: 13-03-2005, 00:11:14
Referenzen: langes Herumprobieren
Schwierigkeit: Anfänger
Ansichten: 53338x
Rating: 8 (4x bewertet)

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Da es bei mir nie funktioniert hat eine Datei auszulesen und diese dann in einem BLOB zu speichern habe ich eine andere Methode ausgetüftelt, wie man binäre Dateien ein einem einfachen TEXT speichert.

Als erstes die benötigte mySQL-Tabelle:
CREATE TABLE `files` (
`id` INT( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`filename` VARCHAR( 30 ) NOT NULL ,
`filetype` VARCHAR( 50 ) NOT NULL ,
`filecontent` MEDIUMTEXT NOT NULL ,
`filesize` VARCHAR(30) NOT NULL ,
PRIMARY KEY ( `id` )
);


Als Typ für `filecontent` sind folgende Optionen möglich:
  • TEXT: speichert 2^16-1 Zeichen -> 64 kB
  • MEDIUMTEXT: speichert 2^24-1 Zeichen-> 16,4 MB
  • LONGTEXT: speichert 2^32-1 Zeichen -> 4 GB
MEDIUMTEXT ist zur Verwendung prädestiniert; TEXT wäre zu klein und LONGTEXT: hat schon jemand mal versucht 4 GB über eine normale Internetverbindung zu übertragen… naja… wird wohl etwas lange dauern ;-)
Außerdem ist die maximale Dateigröße standardmäßig auf 2 MB begrenzt.
Zu beachten ist allerdings, dass der kodierte Inhalt dann ca. 33% größer ist als die Originaldatei.

Diese Tabelle ist nun universell verwendbar.

Über den eigentlichen Upload der Datei will ich hier nicht lange reden deshalb: siehe hier.

Das ganze System soll letztendlich aus 2 Dateien bestehen; je nachdem, wie man dies nutzen will: als Download-Bereich (upload.php und download.php), wenn man Bilder speichern will: upload.php und image.php

In beiden Fällen ist die upload.php gleich:
[UPLOAD.PHP]:

<?php

if($_GET['action'] == "upload") {

// Auf Fehler überprüfen
if ($_FILES['datei']['error'] == UPLOAD_ERR_NO_FILE || $_FILES['datei']['error'] == UPLOAD_ERR_PARTIAL) {
// die Datei wurde nicht oder nur teilweise hochgeladen
die("Die Datei wurde nicht korrekt hochgeladen. Bitte versuchen Sie es erneut.");

} elseif (
$_FILES['datei']['error'] == UPLOAD_ERR_FORM_SIZE || $_FILES['datei']['error'] == UPLOAD_ERR_INI_SIZE) {
// die Datei ist zu groß
die("Die hochgeladene Datei ist zu groß.");

} else {
// die Datei wurde korrekt hochgeladen

// hier sind die mySQL Daten einzufüllen
@mysql_connect("localhost", "user", "passwort");
@
mysql_select_db("db_name");

// Temporäre Datei schreiben (ist wegen der Lese-Rechte nötig)
// und auf die temp-Datei Lese Rechte vergeben
move_uploaded_file($_FILES['datei']['tmp_name'], "./tempfile.tmp");
chmod("./tempfile.tmp", 0644);

// Daten aus Temp-Datei einlesen
$zeiger = fopen("./tempfile.tmp", "rb");
$size = $_FILES['datei']['size'];
// den Dateiinhalt in $data speichern
$data = fread($zeiger, $size);
fclose($zeiger);

// Temporäre Datei löschen
@unlink("./tempfile.tmp");

// Damit die Datei jetzt in die mySQL Tabelle kann müssen wir sie vorher kodieren:
$data = base64_encode($data);

// Leerzeichen im Dateinamen werden mit einem Unterstrich ersetzt
$dateiname = str_replace(" ", "_", $_FILES['datei']['name']);

// Und ab in die mySQL Tabelle...
$sql = "INSERT INTO files VALUES('', '".$dateiname."', '".$_FILES['datei']['type']."', '".$data."', '".$size."')";
@
mysql_query($sql);

echo
"Datei-Upload erfolgreich.";
exit;
}

} else {
// Upload-Formular anzeigen
echo "<form method=\"post\" action=\"" . $PHP_SELF . "?action=upload\" enctype=\"multipart/form-data\">
<input type=\"hidden\" name=\"MAX_FILES_SIZE\" value=\"2097152\">
<input type=\"file\" name=\"datei\" maxlength=\"2097152\"><br>
<input type=\"submit\" name=\"submit\" value=\"Uploaden\">
</form>"
;
}

?>

man muss dem Ordner in dem man die temporären Dateien ablegt CHMOD 0777 geben!

Um die Dateien jetzt wieder Downloaden zu können, brauchen wir folgende Datei:
[DOWNLOAD.PHP]:

<?php

// hier sind die mySQL Daten einzufüllen
@mysql_connect("localhost", "user", "passwort");
@
mysql_select_db("db_name");

if (isset(
$_GET['id'])) {

// Daten über die gewünschte Datei aus mySQL lesen
$sql = "SELECT * FROM files WHERE id = '".$_GET['id']."' LIMIT 1";
$result = @mysql_query($sql);
$row = mysql_fetch_object($result);

// Den Browser zum Download zwingen
header("Content-type: " . $row->filetype);
header("Content-disposition: attachment; filename=".$row->filename.";");
header("Content-length: " . $row->filesize);

// Daten dekodieren und an den Browser senden
echo base64_decode($row->filecontent);

exit;
} else {
// Es wurde keine Datei ausgewählt -> alle Möglichkeiten anzeigen

$sql = "SELECT id, filename FROM files";
$result = @mysql_query($sql);

while (
$row = mysql_fetch_object($result)) {
echo
"<a href=\"".$PHP_SELF."?id=".$row->id."\">".$row->filename."</a><br>";
}

}

?>

Wenn keine Datei angegeben ist, wird einfach eine Übersicht über alle Dateien gegeben.

Will man aber nun seine Bilddateien wieder auslesen dann muss folgende Datei erstellt werden:
[IMAGE.PHP]:

<?php

if (isset($_GET['id'])) {

// hier sind die mySQL Daten einzufüllen
@mysql_connect("localhost", "user", "passwort");
@
mysql_select_db("db_name");

// Daten über das gewünschte Bild aus mySQL lesen
$sql = "SELECT * FROM files WHERE id = '".$_GET['id']."' LIMIT 1";
$result = @mysql_query($sql);
$row = mysql_fetch_object($result);

// Prüfen, ob die gewählte Datei tatsächlich ein Bild ist
if (strpos($row->filetype, "image") !== false) {

// Dem Browser mitteilen, dass jetzt ein Bild kommt
header("Content-type: " . $row->filetype);

// Daten dekodieren und an den Browser senden
echo base64_decode($row->filecontent);
}

exit;
}

?>

Wenn man nun im HTML ein Bild anzeigen will, dann geht das so: <img src=“image.php?id=2“ alt=”Bild Nr.2”>

Diese Dateien sind nun beliebig erweiterbar: z.B. könnte man ein Login für den Download Bereich bauen, Kategorien für die Dateien erstellen, etc.


dweller
Administrator
Beitrag vom:
01-05-2005, 21:42:49

Ein sicherheitstechnisches Kommentar:
Das Verwenden von GET/POST Inhalten ohne deren vorherige Bearbeitung in SQL queries macht dein Skript verwundbar gegenüber SQL Injection Angriffen.

Mögliche Gegenmaßnahmen: http://at.php.net/manual/en/function.mysql-real-escape-string.php

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04508
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06245
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1150
Comments: 0