Position actuelle: Accueil> Derniers articles> Utilisez en tête () pour simuler le scénario de téléchargement des rapports CSV

Utilisez en tête () pour simuler le scénario de téléchargement des rapports CSV

M66 2025-05-18

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.

Étape 1: Préparer les données de CSV

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'],
];

Étape 2: Configurez l'en-tête HTTP

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');

Étape 3: Sortie du contenu CSV

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);

Exemple de code complet

 <?php
$data = [
    ['Nom', 'Mail', 'Temps d&#39;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);

Choses à noter

  1. 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".

  2. 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.

  3. 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.