Maison  >  Article  >  développement back-end  >  Que faire si le nom du fichier de téléchargement du fichier php est tronqué

Que faire si le nom du fichier de téléchargement du fichier php est tronqué

藏色散人
藏色散人original
2022-10-21 10:36:592176parcourir

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(...)".

Que faire si le nom du fichier de téléchargement du fichier php est tronqué

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 :

Le code est le suivant :

$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';
?>
Apprentissage recommandé : "

Tutoriel vidéo PHP🎜"🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn