session_start() zerschießt mir mein Download-Script

Tim C.

Erfahrenes Mitglied
Hallo zusammen.
Vielleicht hat es der eine oder andere, der sich gestern in #tutorials.de aufgehalten hat, schon mitbekommen. Ich bin ein wenig am verzweifeln, da mein Download-Script welches zuvor einwandfrei funktioniert hat, auf einmal nicht mehr geht.

Zur Ausgangssituation:

Ich betreibe lokal eine kleine Page für mich und meine Kumpels. Die Page verfügt über einen Bereich, der nur zugänglich ist, falls man sich einloggt. In diesem Bereich wiederum gibt es eine "Download-Section". Dort gibt es ein paar Freeware Tools, Bilder und andere Nettigkeiten. Das tut aber eigentlich nichts zur Sache. Da ich die jeweiligen Dateien nicht in den htdocs Ordner kopieren wollte bzw es nach wie vor nicht will, habe ich zum Zugriff auf die Dateien ein Download-Protection-Script leicht abgewandelt, welches mit HTTP-Headern und dem readfile() Befehl arbeitet. Dieses Script sitzt in der transfer.php .

Soweit sogut. Es funktionierte (mit Session einwanfrei) und funktioniert auch immer noch. Allerdings NICHT wenn in der ersten Zeile der transfer.php nach <?php ein session_start() steht.

Folgendes passiert:
- Steht das session_start() nicht dort, so bekomme ich den Downloaddialog korrekt angezeigt, ich drücke auf speichern, gebe einen Ort ein und alles ist wunderbar.

- Steht jedoch in der ersten Zeile ein session_start(), so gibt mir der Downloaddialog als Namen der zu speichernden Datei den Querystring an, in dem Verzeichnis und Dateinamen an die transfer.php übergeben wurden. Ich drücke auf speichern und eine Fehlermeldung erscheint, dass die gewünschte Datei nicht vorhanden ist.

Ich muss aber unbedingt die session starten, damit ich überprüfen kann ob der jeweilige User überhaupt eingeloggt ist und somit Zugriff auf die Download-Funktion hat. Der Witz an der Geschichte:
Das hat alles schonmal funktioniert und ich habe seitdem eigentlich nichts geändert :(

Hier die transfer.php (in groben Zügen)
PHP:
<?php
session_start(); //Hab ich eigentlich momentan deaktiviert mit // damit es überhaupt noch geht.
include('sqlconnect.php');
$query = "SELECT value FROM permission WHERE name = 'download'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
if($_SERVER[REMOTE_ADDR] == "127.0.0.1" || substr($_SERVER[REMOTE_ADDR],0,10) == "192.168.1." || $row['value'] == "true") {
if(strlen($_REQUEST['dir']) == "1" || strlen($_REQUEST['dir'] == "2")) {
	switch($_REQUEST['dir']) {
		case 1:
			$path = "C:\\bla/";
			break;
		case 20:
			$path = "E:\\bla\\1\\1/";
			break;
		case 21:
			$path = "E:\\bla\\1\\2/";
			break;
		case 22:
			$path = "E:\\bla\\1\\3/";
			break;
		case 23:
			$path = "E:\\bla\\1\\4/";
			break;
		case 24:
			$path = "E:\\bla\\1\\5/";
			break;
		case 25:
			$path = "E:\\bla\\1\\6/";
			break;
		case 26:
			$path = "E:\\bla\\1\\7/";
			break;
		case 3:
			$path = "E:\\bla\\2/";
			break;
		case 4:
			$path = "E:\\blub/";
			break;
	}
	}
	else {
		$path = str_replace(";","\\\",$_REQUEST['dir']);
		$path = $path."/";
	}
include('mime.php');
$extget = explode(".", $file); 
$extension = $extget[1]; 
$sendmime = $mimetypes[$extension];
header ("HTTP/1.1 200 OK"); 
header("Content-type: $sendmime"); 
header("Content-Disposition: attachment; filename=$file"); 
readfile($path.$file);
}
else {
	echo "<html><head><title>download</title></head><body style=\"background-color: #333333; text-align: center; color: #999999\">";
	echo "<span style=\"font-family: Verdana; font-size: 10\">Die Downloadfunktion ist momentan deaktiviert!</span>";
	echo "</body></html>";
}
?>

Bei Fragen zum Code...immer her damit :)
 
Zuletzt bearbeitet:
-

Hi Leuchte!
Was steht genau in $sendmine drin und woher bekommst du $file?

Versuch mal die Dateigröße der Datei mitzuschicken
PHP:
header('Content-Length: '.filesize($Dateiname));

Pack vorm verschicken des Headers noch $file = basename($file); rein.

Warum das aber in Verbindung mit session_start() nicht funktioniert, kann ich dir im Moment auch nicht sagen. Bei mir läuft so ein ähnliches Script ohne Probleme.
 
Also $sendmime da stehen sachen drinne wie jeweils die zweiten Einträge in den folgenden Zeilen.
PHP:
<?php 
$mimetypes = array( 
'ez' => 'application/andrew-inset', 
'hqx' => 'application/mac-binhex40', 
'cpt' => 'application/mac-compactpro', 
'doc' => 'application/msword', 
...
?>
Das kommt von der includeten Datei mime.php Ist einfach ein Array was die Dateitypen erkennt und dementsprechend den Content-Type übergibt. Deine Vorschläge werde ich gleich mal ausprobieren.

$file wird via Query String übergeben.

Die Geschichte mit basename ist eigentlich nicht nötig, da ich Verzeichnis und Dateinamen getrennt übergebe.
 
Zurück