私の他のQUESTIONを参照してください。PHP File Transer - エコーはデバッグのために別のものを壊しますか?
単純なファイル転送を正常にセットアップしましたが、ページ上に何かをエコーするとファイルが破損し、オープンできなくなっています。ここで
はコードです:
$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;
}
これはうまく動作しますが、私はエコーのコメントを解除した場合、ダウンロードしたファイルが破損している、オープンしません。
これは何とか、エコーがダウンロードするファイルに書き込まれているためですか?おそらく(おそらく)私は完全に上記のプロセスを行っていません。
もちろん、上記のコードがうまく実行されても、エコーは表示されませんが、他のデバッグ方法をお勧めしますか?明らかに、変数値をエコーすることは必ずしも機能しません。他の選択肢はありますか?
http://stackoverflow.com/questions/8028957/how-to-fix-headers-already-sent-error-in-php>回避策としての出力バッファー – Federkun
はい、ページはHTTPプロトコルデータをブラウザに送信します(私はあなたのためのファイルを持っています、ここにファイルがあります)、エコーはランダムなバイトでこれを中断し、ブラウザがサーバが何を言っているのかをブラウザが解釈できないように出力を壊します。 –
これは正しいです、クライアントは '$ file'の内容を受け取り、その文字列をファイルに付加して、その文字列を破損させます。ファイルが存在しないことを報告するには、[error_log](http://php.net/manual/en/function.error-log.php)を使用してカスタムエラーをログに書き込むか、[例外をスローする](http://php.net/manual/en/language.exceptions.php)を使用して独自のエラーを処理します。 – Egg