IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Upload de fichier : mauvais caractères dans le nom du fichier


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Points : 49
    Points
    49
    Par défaut Upload de fichier : mauvais caractères dans le nom du fichier
    Bonjour.

    Je rencontre actuellement un problème concernant un upload de fichier.

    Mon interface web PHP comporte deux champs d'upload de fichier (INPUT type=file) insérés dans un formulaire, et je rencontre un problème lorsque le nom des fichiers que l'on tente d'uploader contient des caractères non autorisés.

    J'ai rencontré ce problème avec un nom de fichier comportant un point par exemple (exemple.blablabla.txt).

    Je poste donc mes fichiers lorsque l'utilisateur clique sur SUBMIT et je teste ce qui a été posté sur une autre page PHP.

    Ma question est donc la suivante :
    Comment tester le nom des fichiers uploadés et surtout à quel moment pour pouvoir éliminer les caractères non-autorisés ?

    Merci beaucoup.

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Avec une expression régulière (regex) et la méthode preg_match
    //ici un nom de fichier qui ne soit composé que de chiffres et de lettres sans accent et en minuscules, et qui ne comporte pas plus d'une fois - ou _ et qui ait une extension en .doc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    function isFileNameOk($test){
    	$pattern="/^[a-z0-9]+[-_]*[a-z0-9]*(\.doc)$/";
    	return preg_match($pattern,$test);
    }
     
    if(isFileNameOk('mon_féchier.doc')){
    	echo 'ok';
    }
    else{
    	echo 'ko';
    }
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Avant d'utiliser un preg match il est utile de remplacer les caractères accentués par leur équivalent non accentués pour garder un maximum de caractères utiles. On peut faire une fonction dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    public function Nettoie_Nom_fichier($nom_fichier)
    {
    	$cible = array(
    	'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Æ', 'Ă', 'Ą',
    	'Ç', 'Ć', 'Č', 'Œ',
    	'Ď', 'Đ',
    	'à', 'á', 'â', 'ã', 'ä', 'å', 'æ', 'ă', 'ą',
    	'ç', 'ć', 'č', 'œ',
    	'ď', 'đ',
    	'È', 'É', 'Ê', 'Ë', 'Ę', 'Ě',
    	'Ğ',
    	'Ì', 'Í', 'Î', 'Ï', 'İ',
    	'Ĺ', 'Ľ', 'Ł',
    	'è', 'é', 'ê', 'ë', 'ę', 'ě',
    	'ğ',
    	'ì', 'í', 'î', 'ï', 'ı',
    	'ĺ', 'ľ', 'ł',
    	'Ñ', 'Ń', 'Ň',
    	'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ø', 'Ő',
    	'Ŕ', 'Ř',
    	'Ś', 'Ş', 'Š',
    	'ñ', 'ń', 'ň',
    	'ò', 'ó', 'ô', 'ö', 'ø', 'ő',
    	'ŕ', 'ř',
    	'ś', 'ş', 'š',
    	'Ţ', 'Ť',
    	'Ù', 'Ú', 'Û', 'Ų', 'Ü', 'Ů', 'Ű',
    	'Ý', 'ß',
    	'Ź', 'Ż', 'Ž',
    	'ţ', 'ť',
    	'ù', 'ú', 'û', 'ų', 'ü', 'ů', 'ű',
    	'ý', 'ÿ',
    	'ź', 'ż', 'ž',
    	'А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
    	'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'р',
    	'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я',
    	'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я'
    	);
     
    	$rempl = array(
    	'A', 'A', 'A', 'A', 'A', 'A', 'AE', 'A', 'A',
    	'C', 'C', 'C', 'CE',
    	'D', 'D',
    	'a', 'a', 'a', 'a', 'a', 'a', 'ae', 'a', 'a',
    	'c', 'c', 'c', 'ce',
    	'd', 'd',
    	'E', 'E', 'E', 'E', 'E', 'E',
    	'G',
    	'I', 'I', 'I', 'I', 'I',
    	'L', 'L', 'L',
    	'e', 'e', 'e', 'e', 'e', 'e',
    	'g',
    	'i', 'i', 'i', 'i', 'i',
    	'l', 'l', 'l',
    	'N', 'N', 'N',
    	'O', 'O', 'O', 'O', 'O', 'O', 'O',
    	'R', 'R',
    	'S', 'S', 'S',
    	'n', 'n', 'n',
    	'o', 'o', 'o', 'o', 'o', 'o',
    	'r', 'r',
    	's', 's', 's',
    	'T', 'T',
    	'U', 'U', 'U', 'U', 'U', 'U', 'U',
    	'Y', 'Y',
    	'Z', 'Z', 'Z',
    	't', 't',
    	'u', 'u', 'u', 'u', 'u', 'u', 'u',
    	'y', 'y',
    	'z', 'z', 'z',
    	'A', 'B', 'B', 'r', 'A', 'E', 'E', 'X', '3', 'N', 'N', 'K', 'N', 'M', 'H', 'O', 'N', 'P',
    	'a', 'b', 'b', 'r', 'a', 'e', 'e', 'x', '3', 'n', 'n', 'k', 'n', 'm', 'h', 'o', 'p',
    	'C', 'T', 'Y', 'O', 'X', 'U', 'u', 'W', 'W', 'b', 'b', 'b', 'E', 'O', 'R',
    	'c', 't', 'y', 'o', 'x', 'u', 'u', 'w', 'w', 'b', 'b', 'b', 'e', 'o', 'r'
    	);
     
    	$nom_fichier = str_replace($cible, $rempl, $nom_fichier);
     
    	$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
     
    	if (trim($nom_fichier) !== '')						 
    	return $nom_fichier;
    	else
    	return false;
    }
    Cette fonction est utilisée dans cette classe d'upload

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur bioinformaticien
    Inscrit en
    Avril 2010
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur bioinformaticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 139
    Points : 49
    Points
    49
    Par défaut
    Merci beaucoup !

    Oui j'ai pris connaissance de diverses fonctions (dont les vôtres maintenant, merci ) pour remplacer les caractères non-autorisés.

    Le problème, c'est de savoir quand et comment je dois intercepter le nom du fichier posté par le formulaire pour pouvoir ensuite retirer les mauvais caractères.

    Or, quand le post est effectué, le fichier n'est pas envoyé sur ma 2nde interface sur laquelle je pourrais effectivement récupérer le nom du fichier puis substituer les caractères non-autorisés par d'autres.

    Je vais voir si ce n'est pas plutôt un problème de contenu des fichiers qui pourraient faire planter le post.

    Un grand merci en tout cas pour vos fonctions !

  5. #5
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Eventuellement tu peux essayer d'utiliser la classe en lien dans mon précédent message pour faire l'upload.
    Il y a des exemples complets d'utilisation et elle possède de nombreuses options : redimensionnement des images, contrôle anti écrasement d'un fichier déjà existant sur le serveur, upload multiple, gestion complète des erreurs... et bien entendu le renommage des fichiers pour avoir un nom correct sur le serveur est fait par défaut.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/02/2014, 22h48
  2. Retrait de chaînes de caractères dans le nom des fichiers.
    Par babiêtiguiya dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 12/10/2011, 00h51
  3. Rechercher une chaine de caractères dans le nom d'un fichier
    Par meuah dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 05/06/2008, 18h54
  4. Limite des 218 caractères dans un nom de fichier
    Par Didier Gonard dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 28/02/2008, 15h28
  5. Changer des caractères dans les noms de fichiers
    Par ForgetTheNorm dans le forum Linux
    Réponses: 2
    Dernier message: 07/01/2008, 15h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo