Solution aux noms de fichiers tronqués lors du téléchargement de fichiers PHP : 1. Définissez "Content-Type" sur "application/octet-stream" 2. Définissez "header('Content-Disposition: attachment; filename*="utf8'' ' . $filename '"');} else {en-tête(...)".
L'environnement d'exploitation de ce tutoriel : système Windows 7, PHP version 8.1, ordinateur Dell G3.
Que faire si le nom de fichier du téléchargement du fichier PHP est tronqué ?
Solution au nom de fichier tronqué du téléchargement PHP
En définissant le type de contenu sur application/octet-stream, vous pouvez télécharger le fichier généré dynamiquement. contenu sous forme de fichier. Je crois que tout le monde Toutes les villes. Utilisez ensuite Content-Disposition pour définir le nom du fichier téléchargé. Beaucoup de gens le savent. En gros, le programme de téléchargement s'écrit comme ceci :
Le code est le suivant :
$filename = "document.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $filename); print "Hello!";
Après l'avoir ouvert avec un navigateur, vous pouvez télécharger le document.txt.
Cependant, si $filename est encodé en UTF-8, certains navigateurs ne peuvent pas le gérer correctement. Par exemple, modifiez légèrement le programme ci-dessus :
Le code est le suivant :
$filename = "中文 文件名.txt"; header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename=' . $filename); print "Hello!";
Enregistrez le programme en encodage UTF-8 puis accédez-y, 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 fait à 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 :
Le code est le suivant :
Content-Disposition: attachment; filename*="utf8''%E4%B8%AD%E6%96%87%20%E6%96%87%E4%BB%B6%E5%90%8D.txt"
C'est-à-dire :
Avant le signe égal après
nom de fichier, ajoutez *
La valeur du nom de fichier est divisée en trois segments avec des guillemets simples, qui sont un jeu de caractères (utf8), la langue (vide) et nom de fichier codé en urlen.
Il est préférable d'ajouter des guillemets doubles, sinon la partie après les espaces dans le nom du fichier ne sera pas affichée dans Firefox
Notez que les résultats de urlencode ne sont pas les mêmes que les résultats de la fonction urlencode de PHP. des espaces par +, et Ceci doit être remplacé par %20
Après les tests, il a été constaté que la prise en charge de plusieurs navigateurs grand public est la suivante :
IE6 attachment; filename="" FF3 attachment; filename="UTF-8文件名" attachment; filename*="utf8''" O9 attachment; filename="UTF-8文件名"
Safari3 (Win) ne semble pas le prendre en charge ? Aucune des méthodes ci-dessus ne fonctionnera
Il semble que le programme doive être écrit comme ceci pour prendre en charge tous les navigateurs grand public :