Datei-Download

Hallo,
ich will eine .exe-Datei zum Download freigeben (mittels header("Content-Type):

$Dateiname = basename($Datei);
$Groesse = filesize($Datei);
header(„Content-Type: Content-Type:application/octet-stream“);
header(„Content-Disposition: attachment; filename=“.$Dateiname);
header("Content-Length: ".$Groesse);
readfile($Datei);

Mit Windows-XP funktioniert der Datei-Download auch bestens.
Heute habe ich einen Test unter Windows-98 gemacht und siehe da es wird eine Datei mit der Länge 0-Byte runtergeladen!
Woran liegt das?

Gruss soso

Nochmal ich,
hab heute nochmal das Verhalten unter Win-XP getestet. Auch hier werden die Files jetzt nicht richtig runtergeladen. Die Länge beträgt immer zwischen 187 Byte und 207 Byte. Es muss also an meinem Hoster liegen da ich seit Freitag nichts verändert habe. Bei einer weiteren Seite auf dem selben Server funktioniert der Download. Die Files stehen dort allerdings unterhalb von DocumentRoot. Dort habe ich den Download so gelösst:

$dl_file=„http://“.$_SERVER[‚HTTP_HOST‘].dirname($_SERVER[‚PHP_SELF‘])."/".$ziel;
header(„Location: $dl_file“);

Was kann da auf dem Server los sein?

Nochmal ich,
hab heute nochmal das Verhalten unter Win-XP getestet. Auch
hier werden die Files jetzt nicht richtig runtergeladen. Die
Länge beträgt immer zwischen 187 Byte und 207 Byte.

Was kann da auf dem Server los sein?

hast du mal die 187 byte im notepad geoeffnet? ich wuerde ja vermuten, dass da etwas wie „warning could not open stream“ drin steht…

hast du mal die 187 byte im notepad geoeffnet? ich wuerde ja
vermuten, dass da etwas wie „warning could not open stream“
drin steht…

Richtig!
readfile() gibt FALSE zurück. Letzten Freitag ging das aber noch. Hat da jemand eine Einstellung geändert?

u.u. - aber wichtig waere zu wissen, was als grund fuer den fehler ausgegeben wird, vllt. hast du dich nur mit dem pfad vertan.

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

u.u. - aber wichtig waere zu wissen, was als grund fuer den
fehler ausgegeben wird, vllt. hast du dich nur mit dem pfad
vertan.

Ich prüfe natürlich vorher ob das File vorhanden ist. Ausgegeben wird meine Fehlermeldung (… kann nicht geoeffnet werden!). Wenn ich das error() weglasse wird ein 0-Byte File runtergeladen. Hier währe natürlich auch schön wenn die Fehlermeldung nicht im File stehen würde sondern auf dem Bildschirm.
Hier die aktuelle Version (der Dateiname steht in $Link, das Verzeichniss in $Files_Dir):

$Datei = $Files_Dir . $Link;
if(!file_exists($Datei)) {
error(3102,„File $Datei existiert nicht!“,true);
}
$Dateiname = basename($Datei);
$Groesse = filesize($Datei);
header(„Content-Type: Content-Type:application/octet-stream“);
header(„Content-Disposition: attachment; filename=“.$Dateiname);
header("Content-Length: „.$Groesse);
readfile($Datei) or error(3108, $Dateiname . " kann nicht geoeffnet werden!“,true);

u.u. - aber wichtig waere zu wissen, was als grund fuer den
fehler ausgegeben wird, vllt. hast du dich nur mit dem pfad
vertan.

Ich prüfe natürlich vorher ob das File vorhanden ist.
Ausgegeben wird meine Fehlermeldung (… kann nicht geoeffnet
werden!). Wenn ich das error() weglasse wird ein 0-Byte File
runtergeladen. Hier währe natürlich auch schön wenn die
Fehlermeldung nicht im File stehen würde sondern auf dem
Bildschirm.

Hier die aktuelle Version (der Dateiname steht in $Link, das
Verzeichniss in $Files_Dir):

$Datei = $Files_Dir . $Link;
if(!file_exists($Datei)) {
error(3102,„File $Datei existiert nicht!“,true);
}
$Dateiname = basename($Datei);
$Groesse = filesize($Datei);
header(„Content-Type:
Content-Type:application/octet-stream“);
header(„Content-Disposition: attachment;
filename=“.$Dateiname);
header("Content-Length: „.$Groesse);
readfile($Datei) or error(3108, $Dateiname . " kann nicht
geoeffnet werden!“,true);

naja, es scheint mir irgendwie sinnvoll den fehler nicht nur zu melden, sondern auch zu behandeln, z.b. durch ein error(…); exit;

naja, es scheint mir irgendwie sinnvoll den fehler nicht nur
zu melden, sondern auch zu behandeln, z.b. durch ein
error(…); exit;

Das exit; ist in der error()-Funktion enthalten.
Gibt es denn eine Variable die im Apache-Server gesetzt sein muss damit man Dateien ausserhalb von DocumentRoot runterladen kann?

nicht unbedingt im apache, aber in der php_ini gibt es unangenehme sachen wie safe_mode, open_basedir etc… http://www.phpbb.de/doku/kb/artikel.php?artikel=30

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