mmofacts.com

Upload/Download und anzeigen über MySql

gepostet vor 19 Jahre, 1 Monat von The_Alien
Hab jetzt schon php.net durch etc aber irgendwie bekomme ich folgendes nicht so ganz hin:

1. User können Dateien Uploaden die dann in einer Tabelle gespeichert werden.
2. Man kann diese Dateien auch wieder downloaden
3. Und die Jpg Dateien verkleinert anzeigen für eine art Galerie.

und evtl. das man sie per E-Mail Anhang versenden kann.
gepostet vor 19 Jahre, 1 Monat von None
1.) http://de2.php.net/de/is_uploaded_file

der neue dateiname aus gründen der eindeutigkeit am besten ein md5 auf die datei + normale extension, das ganze dann in eine mysqldb (standart)

2.) entweder speicherst du die dateien an einem ort wo der webserver gut zugriff drauf hat oder du überlegst dir etwas mit datei via php senden (sollte auch recht einfach gehen eigentlich)


3.) schau dir mal gd an
gepostet vor 19 Jahre, 1 Monat von TheUndeadable
a) Standarten sind für den Bundespräsident
b) Zum Topic:

Du kannst mit Hilfe der superglobalen Variablen $_FILES hochgeladene Dateien identifizieren. Achte darauf, dass du den enctype deines Formulars auf dem richtigen Wert setzt, ansonsten kann PHP nichts mit den hochgeladenen Daten anfangen (Siehe Doku)

Es gibt nun 2 Möglichkeiten die Daten zu speichern
1.) In der Datenbank direkt (BLOB-Felder)
Vorteile:
- Die Dateien werden automatisch gelöscht, wenn der Datensatz entfernt wird
- Du hast alle Daten beieinander
- Einfaches Backup
Nachteile:
- Etwas unhandliche Datenbank, sie bläht sich auch auf, wie es mit der Performance aussieht, muss getestet werden
- Versenden der Datei nur über ein PHP-Skript möglich

2.) Als Datei und ein Feld in der Datenbank weist dann einem Datensatz die Datei zu (Bsp: Datei unter /img/user/abcd.jpg und in der Db steht dann bei User X: filename=>abcd)
Vorteile:
- Direkter HTTP-Download per URL möglich (httpx.xxx/img/user/abcd.jpg)
Nachteile:
- Trennung der Daten in zwei Bereiche
- Löschung der Datei muss bei Löschung des Datensatzes von Hand geschehen (Gefahr von Dateileichen)

Ich persönlich nutze meist Punkt 2 und abstrahiere den kompletten Datensatz zu in einer Klasse, dass es im Prinzip egal ist, ob die Daten in der Db liegen oder als Datei.
gepostet vor 19 Jahre, 1 Monat von The_Alien
Das Uploaden ist nicht das Problem. Wollte die upgelodeten Dateien wie schon erwähnt in ein Blob Feld laden - der Grund war eigentlich nur damit es keinen Direktlink gibt.

Zumal man in einem Blob Feld keine 100 Mb Dateien usw reinbekommt und die DB mit der Zeit wirklich recht unhandlich wird.

Habe das nun anders gelöst. Ganz normaler Upload in einen Unterordner und dann folgendes Script damit es kein direktlink gibt den man "weiterverwenden" kann:


function dl_file($file)
{
if (!is_file($file)) { die("404 Datei nicht gefunden!"); }
$len = filesize($file);
$filename = basename($file);
$file_extension = strtolower(substr(strrchr($filename,"."),1));
switch( $file_extension ) {
case "pdf": $ctype="application/pdf"; break;
case "exe": $ctype="application/octet-stream"; break;
case "zip": $ctype="application/zip"; break;
case "doc": $ctype="application/msword"; break;
case "xls": $ctype="application/vnd.ms-excel"; break;
case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
case "gif": $ctype="image/gif"; break;
case "png": $ctype="image/png"; break;
case "jpeg":
case "jpg": $ctype="image/jpg"; break;
case "mp3": $ctype="audio/mpeg"; break;
case "wav": $ctype="audio/x-wav"; break;
case "mpeg":
case "mpg":
case "mpe": $ctype="video/mpeg"; break;
case "mov": $ctype="video/quicktime"; break;
case "avi": $ctype="video/x-msvideo"; break;

case "php":
case "htm":
case "html":
case "txt": die("Unerlaubter Dateityp ". $file_extension ." !"); break;

default: $ctype="application/force-download";
}
header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: public");
header("Content-Description: File Transfer");
header("Content-Type: $ctype");
$header="Content-Disposition: attachment; filename=".$filename.";";
header($header );
header("Content-Transfer-Encoding: binary");
header("Content-Length: ".$len);
@readfile($file);
exit;
}

Man kann so einfach eine Datei angeben und wird über das Script gedownloaded. Nur man selber kennt den richtigen Pfad.

Auf diese Diskussion antworten