Fehler bei Datei Download: Kann Speichern aber nicht direkt öffnen

ahykes

Erfahrenes Mitglied
Hallo Zusammen,

ich würde mich nicht melden, wenn ich nicht schon das ganze Internet in meinem Cache hätte :rolleyes:
Folgendes:

Ich habe einen Onlinedateibrowser geschrieben, der Dateien von einem entferntem System innerhalb meiner Domäne anzeigt. Dies geschieht über UNC-Pfade. (Rechte sind vorhanden) Über diesen Dateibrowser könnten Datei gelöscht, geschrieben und eben auch heruntergeladen werden.

Nun kommt mein Problem. Wenn ich den Download einer Datei anstoße, kommt die Frage ob ich Speichern oder Öffnen will. Lege ich die Datei im lokalen Dateisystem ab (Speichern) , kann ich sie öffnen und anzeigen. Klicke ich aber auf Öffnen, so passiert NICHTS oder das Programmfenster geht auf aber die Datei wird nicht geöffnet. Ich versteh es nicht.
Hier kommt mein Code:

PHP:
if( isset( $_GET["pathName"] ) && RFA_USER_PERMISSION_READ == 1 ){
	
                //Übergebenen Pfad entschlüsseln
	$nodePathName = FileNode::decrypt($_GET["pathName"]);
		
	//File Objekt erstellen - Geht hier was schief wird eine Exception geworfen:: Zum Beispiel wenn die Datei nicht existiert.
	$file = new FileNode($nodePathName);
	
	$filePointer = $file->getPath() ."/". $file->getName();
				
	header("Content-Type: application/pdf");
	header("Content-Disposition: attachment; filename=\""$file->getName()."\"");
	header("Content-Length: ".filesize($filePointer));
				
	readfile($filePointer);
	
}
 
Eines habe ich vergessen: Das Problem tritt nur im IE 6 auf! Da wir den nehmen MÜSSEN habe ich das Problem :-$ IE8 & Firefox sind IO!
 
Zuletzt bearbeitet:
Ein Schuss ins Blaue: der "neue" Header wird nicht verarbeitet weil weiter oben schon etwas ausgegben wurde?
 
Meinst Du ich soll ob_start() etc verwenden? Mich wundert, dass es andere Browser verarbeiten können.
 
Die folgenden Header werden zuvor gesenden:
PHP:
header ("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header ("Expires: Sun, 31 Jan 1982 01:32:00 GMT"); // Datum in der Vergangenheit
 
Evtl. ein Internet-Explorer-Plugin, das mit der Virenscanner-Software installiert wurde? Am PHP-Code ist erstmal nichts ungewöhnliches zu erkennen. Du könntest aber noch folgenden Header senden:

PHP:
header("Pragma: no-cache");

Ansonsten empfehle ich mal ein Browser-Header-Trace-Plugin wie http://www.blunck.se/iehttpheaders.html

EDIT: Ansonsten mal das Beispiel auf php.net im Manual anschauen: http://us3.php.net/manual/en/function.readfile.php
 
Zuletzt bearbeitet:
Hallo und Guten Morgen.
Vielen Dank für Eure Antworten. Ich habe nun eine Lösung gefunden, die mich aber in sofern nicht weiterbringt weil ich nicht weiß woran es gelegen hat. Hier kommen die Einzelheiten:

Packt man den folgenden Code in eine Datei, funktioniert das Ganze:
PHP:
    $pathName = base64_decode($_GET["pathName"]);
	
    header('Content-Type: application/octet-stream; charset=utf-8');
    header('Content-Disposition: attachment; filename='.basename($pathName));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($pathName) );
    ob_clean();
    flush();
    readfile($pathName);
    exit;

In $_GET["pathName"] steht also eine mit base64-kodierte Pfadangabe (UNC-Pfad) zu einer Datei, die ich herunterladen möchte. base64 Nutze ich, damit man a.) Das ganze nicht sofort lesen kann und b.) Ich mir keine Gedanken beim Übertragen machen muss.

Was mir auffällt, ist die Tatsache, dass ich hier mein "FileNode"-Objekt nicht verwende. :-) Vielleicht habe ich da noch ein Ei drin. Fakt ist: Der Download passt - und zwar überall. Das war der Sinn des Posts. Vielen Dank!
 
Zurück