10 votes

Quels sont les caractères que je dois échapper/anitiser pour les noms de fichiers ?

J'ai besoin d'assainir certaines données qui seront utilisées dans les noms de fichiers. Certaines de ces données contiennent des espaces et des caractères d'esperluette. Existe-t-il une fonction qui permet d'échapper ou d'assainir des données pouvant être utilisées dans un nom de fichier (ou un chemin) ? Je n'en ai pas trouvé dans la section "Fonction système de fichiers" du manuel PHP.

Donc, en supposant que je doive écrire ma propre fonction, quels caractères dois-je échapper (ou changer) ?

10voto

RichieHindle Points 98544

Pour Windows :

/ \ : * ? " < > |

Pour Unix, techniquement rien, mais en pratique la même liste que pour Windows serait judicieuse.

Il n'y a pas de problème avec les espaces ou les esperluettes, à condition que vous soyez prêt à utiliser des guillemets sur les lignes de commande lorsque vous manipulez les fichiers.

(BTW, j'ai obtenu cette liste en essayant de renommer un fichier sous Windows en quelque chose incluant un deux-points, et en copiant à partir du message d'erreur).

5voto

Nick Presta Points 13298

Au lieu de filtrer les personnages, pourquoi ne pas simplement autoriser [a-z0-9- !@#$%^()] ? C'est certainement plus facile que d'essayer de deviner chaque caractère qui pourrait potentiellement causer des problèmes.

Vos utilisateurs ne devraient pas avoir besoin d'un fichier avec d'autres caractères, n'est-ce pas ?

5voto

merkuro Points 4077

Si vous avez la possibilité de stocker le nom original dans une base de données, je créerais simplement un fichier avec un hachage aléatoire (mt_rand()/md5/sha1). L'avantage est que vous ne dépendez pas du système d'exploitation sous-jacent (longueur des caractères/chemins), de la valeur ou de la longueur de la saisie de l'utilisateur et, de plus, il est très difficile de deviner/falsifier un nom de fichier. Peut-être même qu'un encodage base64 est une option.

3voto

cube Points 1789

Ce serait une bonne idée d'enlever tout ce qui est en dehors de [a-z0-9_\-.]. Il n'est pas nécessaire d'être aussi strict, mais il est confortable d'avoir une liste de répertoire sans surprise. Si vous travaillez avec des jeux de caractères bizarres, vous voudrez peut-être convertir l'encodage en ascii plat avant de supprimer les caractères incriminés (sinon vous risquez de tout supprimer). ...

du moins, c'est comme ça que je le fais :-)

2voto

garethm Points 1465

Lors de l'assainissement des chaînes de caractères pour les noms de fichiers, nous filtrons tous les caractères inférieurs à 0x20, ainsi que <, >, :, ", /, \, |, ? et *.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X