Datein verschieben

Ich habe ein Problem:
Ich will auf meiner Seite downloads anbieten. Aber dafür muss man sienen Name und etc. angeben damit ich weiß wer das Programm hat. Das geht auch alles mit php aber wenn man so was nun Downloaded sieht man ja den Pfad der Datei. Nun bin ich auf die Idee gekommen, dass man die Datei ,wenn man seinen Namen angegeben hat, in einen Ordner kopiert und wenn das Download abgeschlossen ist einfach wieder löscht. Wenn sich der Downloader sich den Pfad merkt dann nützt das ihm ja nun nichts mehr weil die Datei dort nicht mehr existiert.

So wie geht das?

jein
sicher geht das, aber Du weisst nie wie lange der Download braucht (DSL,ISDN,Modem,T1,T3 etc)

Eine bessere Lösung wäre die Datei ausserhalb des Webserver-Verzeichnisses zu speichern oder falls das nicht geht das Verzeichnis mit htaccess zu schützen un mittels headern die Datei direkt an den Client zu senden. Such mal ein wenig weiter unten - kam in den letzten Tagen paarmal dran das Thema…

Ich würde strikt davon abraten, Dateien auch wenn nur temporär auf dem server herumzukopieren.
Du kannst auch eine Datei direkt durch eine php-Seite „routen“. D.h. der user ruft eine php-seite (mit einigen Argumenten) und er erhält die gewünschte Datei. Hier ein Beispiel:

$filename = $image;
$ext = substr( $filename,-3 );
$basedir=„images/“;

einige Abfragen, um sicherzustellen, dass die Datei existiert.

if( $filename == „“ )
{
echo „ERROR: Empty file $filename to download. USE download.php?file=[file path]“;
exit;
}
elseif ( ! file_exists( $_SERVER[DOCUMENT_ROOT]."/".$basedir.$path."/".$filename) )
{
echo „ERROR: File „.$_SERVER[DOCUMENT_ROOT].“/“.$basedir.$path."/".$filename." not found. USE download.php?file=[file path]";
exit;
};

SEHR wichtig. Hier wird der MIME-type gesetzt.

switch(strtolower( $ext ))
{
case „pdf“: $ctype=„application/pdf“;$isimage=0;break;
case „exe“: $ctype=„application/octet-stream“;$isimage=0;break;
case „zip“: $ctype=„application/zip“;$isimage=0;break;
case „doc“: $ctype=„application/msword“;$isimage=0;break;
case „xls“: $ctype=„application/vnd.ms-excel“;$isimage=0;break;
case „ppt“: $ctype=„application/vnd.ms-powerpoint“;$isimage=0;break;
case „gif“: $ctype=„image/gif“;$isimage=1;break;
case „png“: $ctype=„image/png“;$isimage=1;break;
case „jpg“: $ctype=„image/jpg“;$isimage=1;break;
default: $ctype=„application/force-download“;
}
header(„Content-Type: $ctype“);

je nach browser muss man hier den dateinamen angeben, damit die Datei als solche erkannt wird. Das kann man sich bei Bilddateien aber ersparen.

$user_agent = strtolower ($_SERVER[„HTTP_USER_AGENT“]);
if ((is_integer (strpos($user_agent, „msie“))) && (is_integer (strpos($user_agent, „win“))))
{
header( „Content-Disposition: filename=“.basename($filename).";" );
}
else
{
header( „Content-Disposition: attachment; filename=“.basename($filename).";" );
}

Grösse der Datei angeben. Muss man aber auch nicht unbedingt. Nervt nur beim Download, wenn der Browser die Grösse nicht kennt…

header(„Content-Length: „.filesize($_SERVER[DOCUMENT_ROOT].“/“.$basedir.$path."/".$filename));

Ausgabe der Datei.

readfile($_SERVER[DOCUMENT_ROOT]."/".$basedir.$path."/".$filename);
exit();
?>
Eine mögliche Anfrage wäre also:
download.php?image=kleiner%20Hund.jpg

da kann man aber noch weitergehen und über ne datenbank viel mehr machen…

islaminhannover.de

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]