クライアントはそれがCSVファイルであることを知りません(結局のところ、それは単なるテキストです!)。
出力の前に(スクリプトの上部に)これを追加してみてください:
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
基本的に、CSVファイルを送信するデータをクライアント/ブラウザに通知します。
うまくいくはずです。
ヘッダーの詳細については、http://php.net/manual/を参照してください。 en / function.header.php