Maison > Article > développement back-end > Code d'implémentation PHP pour le téléchargement de fichiers et solutions aux caractères tronqués dans les noms de fichiers
Quelqu'un m'a récemment demandé comment télécharger des fichiers. La méthode PHP est la suivante :
<?php header("Content-Type: application/force-download"); header("Content-Disposition: attachment; filename=ins.jpg"); readfile("imgs/test_Zoom.jpg"); ?>
La première ligne de code consiste à forcer le téléchargement
La deuxième ligne de code consiste à attribuer un ; nom du contenu téléchargé
La troisième ligne de code consiste à lire le contenu téléchargé dans le fichier.
Comment résoudre les caractères tronqués dans les noms de fichiers de téléchargement PHP
En définissant le type de contenu sur application/octet-stream, vous pouvez télécharger du contenu généré dynamiquement 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. En gros, le programme de téléchargement s'écrit comme ceci :
<?php $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, si vous modifiez légèrement le programme ci-dessus :
<?php $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 :
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 :
Le signe égal après le nom de fichier doit être précédé de *
La valeur du nom de fichier est divisée en trois segments entre guillemets simples, qui sont un jeu de caractères (utf8), 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 le résultat de urlencode n'est pas le même que le résultat de la fonction urlencode de PHP. remplacera les espaces par, Ceci doit être remplacé par
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 = "e579d2dd5957c9391aab4a3b6a648b68"
Pièce jointe FF3 ; filename="Nom du fichier UTF-8"
Pièce jointe; filename*="utf8''65608dbef62a5e550252cfbad7d6d003"
Pièce jointe O9; filename= "Nom de fichier UTF-8"
Safari3(Win) ne semble pas pris 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 :
<?php $ua = $_SERVER["HTTP_USER_AGENT"]; $filename = "中文 文件名.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: attachment; filename*="utf8\'\'' . $filename . '"'); } else { header('Content-Disposition: attachment; filename="' . $filename . '"'); } print 'ABC'; ?>
Plus d'articles connexes sur le code d'implémentation PHP pour le téléchargement de fichiers et les solutions aux caractères tronqués dans les noms de fichiers Veuillez faire attention au site Web PHP chinois !