Dans le développement Web, nous devons parfois générer dynamiquement un rapport CSV via le backend et le fournir aux utilisateurs à télécharger, au lieu de le mettre sur le serveur à télécharger. La fonction d'en-tête () de PHP peut être utilisée pour modifier l'en-tête de réponse HTTP et la combiner avec le contenu de sortie pour réaliser cet effet "téléchargement simulé".
Cet article vous amènera à implémenter cette fonction étape par étape.
Tout d'abord, nous devons avoir une copie des données CSV à sortir. Il peut être extrait de la base de données ou il peut être un tableau préparé manuellement.
$data = [
['Nom', 'Mail', 'Temps d'inscription'],
['Zhang San', 'zhangsan@m66.net', '2025-05-01 10:00:00'],
['Li si', 'lisi@m66.net', '2025-05-02 11:30:00'],
['Wang wu', 'wangwu@m66.net', '2025-05-03 14:15:00'],
];
Utilisez la fonction en-tête () pour indiquer au navigateur qu'il s'agit d'une réponse de téléchargement de fichiers, pas d'une sortie de page Web normale. Ce qui est particulièrement important, c'est:
Le type de contenu indique au navigateur qu'il s'agit d'un fichier CSV;
La disposition de contenu définit le formulaire de pièce jointe et fournit le nom du fichier téléchargé;
Le contrôle du cache et le pragma aident à éviter les problèmes de mise en cache.
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="report.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
Vous pouvez utiliser fopen ('php: // output', 'w') pour écrire le contenu directement sur le flux de sortie, et il n'est pas nécessaire de générer un fichier intermédiaire.
$output = fopen('php://output', 'w');
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
<?php
$data = [
['Nom', 'Mail', 'Temps d'inscription'],
['Zhang San', 'zhangsan@m66.net', '2025-05-01 10:00:00'],
['Li si', 'lisi@m66.net', '2025-05-02 11:30:00'],
['Wang wu', 'wangwu@m66.net', '2025-05-03 14:15:00'],
];
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="report.csv"');
header('Cache-Control: no-cache, no-store, must-revalidate');
header('Pragma: no-cache');
header('Expires: 0');
$output = fopen('php://output', 'w');
foreach ($data as $row) {
fputcsv($output, $row);
}
fclose($output);
N'ont pas de sortie supplémentaire <br> Avant d'appeler Header () , il ne peut y avoir de sortie inutile (y compris les espaces, les pauses de ligne, BOM), sinon cela provoquera une erreur "En-têtes déjà envoyée".
Problèmes de codage <br> Si le CSV généré contient des caractères chinois, il est préférable d'utiliser UTF-8 BOM ou de le convertir en GBK pour éviter le code brouillé lors de l'ouverture dans Excel.
Données dynamiques <br> L'exemple ci-dessus utilise des tableaux statiques. Dans les projets réels, vous devez souvent interroger à partir de la base de données, puis l'épeler dans un tableau.