En définissant Content-Type sur application/octet-stream, le contenu généré dynamiquement peut être téléchargé sous forme de fichier, je pense que tout le monde le sait. Utilisez ensuite Content-Disposition pour définir le nom du fichier téléchargé. Beaucoup de gens le savent. Fondamentalement, le programme de téléchargement est écrit comme ceci :
<?php$filename = “document.txt”;header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print "Bonjour!";?>Après l'avoir ouvert avec un navigateur, vous pouvez télécharger le document.txt.
Cependant, si $filename est codé en UTF-8, certains navigateurs ne peuvent pas le gérer correctement. Par exemple, modifiez légèrement le programme ci-dessus :
<?php$filename = "Chinese file name.txt";header('Content-Type: application/octet-stream');header('Content-Disposition: attachment; filename=' . $filename);print « Bonjour ! » ;?> Si vous enregistrez le programme en codage UTF-8 et que vous y accédez ensuite, le nom du fichier téléchargé par IE6 sera tronqué. Le nom du fichier téléchargé sous FF3 ne comporte que le mot « chinois ». Tout fonctionne bien sous Opera 9.
L'en-tête de sortie ressemble en réalité à ceci :
Content-Disposition: attachment; filename=Chinese file name.txt En fait, selon la définition de la RFC2231, l'encodage multilingue Content-Disposition devrait être défini comme ceci :
Content-Disposition: attachment ; filename*=”utf8 "%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt" signifie :
ajouter * avant le signe égal après le nom du fichier
La valeur du nom de fichier est divisée en trois segments avec des guillemets simples, qui sont le jeu de caractères (utf8), la langue (vide) et le nom de fichier codé en urlen.
Il est préférable d'ajouter des guillemets doubles, sinon la partie après l'espace dans le nom du fichier ne sera pas affichée dans Firefox. Notez que le résultat de urlencode n'est pas le même que le résultat de la fonction urlencode de PHP. PHP urlencode remplacera l'espace par. +, et ici il faut le remplacer par %20
Après les tests, il a été constaté que la prise en charge de plusieurs navigateurs grand public est la suivante :
pièce jointe IE6 = "<nom du fichier UTF-8 après le codage de l'URL>"
Pièce jointe FF3 ; nom de fichier ="Nom du fichier UTF-8"
pièce jointe ; nom de fichier*="utf8"<nom du fichier UTF-8 après le codage de l'URL>"
Pièce jointe O9 ; nom de fichier ="nom de fichier UTF-8"
Safari3 (Win) ne semble pas pris en charge ? Aucune des méthodes ci-dessus ne fonctionne
. Il semble que le programme doive être écrit comme ceci pour prendre en charge tous les navigateurs courants :
<?php$ua = $_SERVER["HTTP_USER_AGENT"];$filename = "Chinese file name.txt";$encoded_filename. = urlencode( $filename);$encoded_filename = str_replace("+", "%20", $encoded_filename);header('Content-Type : application/octet-stream');if (preg_match("/MSIE/", $ua) ) { header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');} else if (preg_match("/Firefox/", $ua)) { header('Content-Disposition : pièce jointe; nom de fichier*=”utf8'” . $nom de fichier . '"');} else { header('Content-Disposition: pièce jointe; nom de fichier='' . $nom de fichier . '"');}print 'ABC ' ; >