Le client ne sait pas qu'il s'agit d'un fichier CSV (ce n'est que du texte après tout !).
Essayez d'ajouter ceci AVANT toute sortie (en haut de votre script) :
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
Fondamentalement, vous dites au client/navigateur que les données que vous enverrez seront un fichier CSV.
Cela devrait fonctionner.
Vous pouvez trouver plus d'informations sur les en-têtes ici :http://php.net/manual/ fr/function.header.php