2016-04-08 5 views
0

Siehe meine anderen QUESTION.PHP File Transer - Echo bricht Dinge, alternative zum Debuggen?

Ich habe erfolgreich eine einfache Dateiübertragung eingerichtet, aber ich habe festgestellt, dass der Versuch, etwas auf der Seite zu wiederholen, die Datei korrumpiert, so dass sie nicht geöffnet werden kann.

Hier ist der Code:

$filename = $_GET['filename']; 
$dir = "C:/Users/Me/Desktop/"; 
$file = realpath($dir . $filename); 

//echo "$filename</br>$dir</br>$file"; 

if (file_exists($file)) {  
    header('Content-Disposition: attachment; filename="'.basename($file).'"'); 
    header('Content-Type: application/octet-stream');  
    header('Content-Length: ' . filesize($file)); 
    readfile($file); 
    exit; 
} 

Das funktioniert ganz gut, aber wenn ich das Echo Kommentar-, wird die heruntergeladene Datei beschädigt und wird nicht geöffnet.

Liegt das daran, dass das Echo irgendwie in die Datei geschrieben wird, die heruntergeladen werden soll? Vielleicht (wahrscheinlich) tue ich den oben beschriebenen Prozess nicht vollständig.

Offensichtlich wird das Echo nicht angezeigt, wenn der obige Code trotzdem erfolgreich ausgeführt wird, aber welche anderen Debugpraktiken würden Sie empfehlen? Es ist klar, dass das Wiedergeben von Variablenwerten nicht immer funktioniert. Irgendwelche Alternativen?

+0

http://stackoverflow.com/questions/8028957/how-to-fixe-headers-already-sent-error-in-php> Ausgabe Pufferung als Workaround – Federkun

+1

Ja, Ihre Seite sendet HTTP-Protokolldaten an den Browser beschreiben was es tun wird (ich habe eine Datei für Sie, hier ist die Datei), das Echo unterbricht dies zufällig mit zufälligen Bytes, die die Ausgabe korrumpieren, da der Browser nicht interpretieren kann, was der Server ihm sagt. –

+1

Das ist richtig, der Client erhält den Inhalt der '$ Datei', wobei der Text der Datei mit der Zeichenfolge vorangestellt wird, wodurch sie korrumpiert wird. Um zu melden, dass die Datei nicht existiert, können Sie benutzerdefinierte Fehler mit [error_log] (http://php.net/manual/en/function.error-log.php) in das Protokoll schreiben oder Sie können [eine Ausnahme auslösen ] (http://php.net/manual/en/language.exceptions.php), um Fehler auf Ihre eigene Weise zu behandeln. – Egg

Antwort

1

Ja, wenn Sie einige Daten zurückgeben, wird es Teil der Datei, die Sie senden, und wahrscheinlich wird es beschädigt.

Ich würde Ihnen empfehlen, die error_log Funktion zu betrachten. Dadurch können Sie in eine Protokolldatei schreiben, die sich nicht auf die Ausgabe auswirkt. Sie können das Protokoll regelmäßig ansehen und nach wichtigen Fehlern suchen.