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 :

Nettoyer un nom de fichier avant rename() [PHP 4]


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut Nettoyer un nom de fichier avant rename()
    Bonjour à tous,

    Pour nettoyer des noms de fichiers avant un upload, j'utilise une fonction de nettoyage standard :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function nettoie($str, $charset='utf-8')
    {
    $str = htmlentities($str, ENT_NOQUOTES, $charset);
    $str = preg_replace('#\&([A-za-z])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $str);
    $str = preg_replace('#\&([A-za-z]{2})(?:lig)\;#', '\1', $str); 
    $str = preg_replace('#\&[^;]+\;#', '', $str);  
    return $str;
    }
    Elle fonctionne très bien lors d'un upload classique et :
    chaîne_dégueu.zip devient bien chaine_degueu.zip

    Idem si je teste à l'affichage.
    Mais si je veux utiliser la fonction rename pour un fichier qui est déjà sur le serveur, ça ne fonctionne plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $avant = "chaîne_dégueu.zip";
    $apres = nettoie($avant);
    rename($avant, $apres);
    Quelqu'un sait pourquoi ? J'ai pourtant ajouté un encodage UTF-8...

  2. #2
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    Peut-être faut-il mettre le chemin complet ? Comme dans l'exemple ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
    rename("/tmp/tmp_file.txt", "/home/user/login/docs/my_file.txt");
    ?>
    Sinon, peut-être est-ce un problème de droit ?

  3. #3
    Membre averti Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Points : 436
    Points
    436
    Par défaut
    Bonjour Bricecol,

    En fait non, j'ai trouvé la soluce pour un nettoyage de fichiers déjà présents sur le serveur - elle est différente de celle qui consiste à nettoyer pendant un upload avec move_uploaded_file() !
    Bien sûr, les bons droits doivent être accordés aux fichiers.

    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
     
    //1ere fonction encode 8859-1
    function clean_utf8($str, $charset='iso-8859-1')
    {
    $str = htmlentities($str, ENT_NOQUOTES, $charset);
    $str = preg_replace('#\&([A-za-])(?:acute|cedil|circ|grave|ring|tilde|uml)\;#', '\1', $str);
     
        return $str;
    }
     
     
    //2eme fonction: nettoie
    function clean_file_name($str) { //nettoyage serveur
    $str = clean_utf8($str);
    $return = '';
    for ($i=0; $i <= strlen($str)-1; $i++) {
    if (eregi('[a-z]',$str{$i})) $return .= $str{$i};
    elseif (eregi('[0-9]', $str{$i})) $return .= $str{$i};
    elseif (ereg('[àâäãáåÀÁÂÃÄÅ]', $str{$i})) $return .= 'a';
    elseif (ereg('[æÆ]', $str{$i})) $return .= 'a';
    elseif (ereg('[çÇ]', $str{$i})) $return .= 'c';
    elseif (ereg('[éèêëÉÈÊËE]', $str{$i})) $return .=  'e';
    elseif (ereg('[îïìíÌÍÎÏ]', $str{$i})) $return .= 'i';
    elseif (ereg('[ôöðòóÒÓÔÕÖ]', $str{$i})) $return .= 'o';
    elseif (ereg('[ùúûüÙÚÛÜ]', $str{$i})) $return .= 'u';
    elseif (ereg('[ýÿÝŸ]', $str{$i})) $return .= 'y';
    elseif (ereg('[ ]', $str{$i})) $return .= '_';
    else $return .= $str{$i};
    }
    #
    return $return;
    }
    Peut-être pas très orthodoxe, mais ça fonctionne sur mon serveur.
    Merci à toi d'être passé sur ce post et bonne journée.

  4. #4
    Membre éclairé
    Avatar de bricecol
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Avril 2007
    Messages
    364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 364
    Points : 654
    Points
    654
    Par défaut
    Ok, tu savais déjà que le problème était lié à l'encodage. Je pensais que cela venait d'autre part du coup ^^

    Pas de problème, tant mieux si tu as trouvé une solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/08/2012, 14h39
  2. [AC-2003] Modifier un nom d'un fichier avant importation
    Par CIRE3 dans le forum VBA Access
    Réponses: 13
    Dernier message: 21/07/2012, 16h11
  3. Réponses: 2
    Dernier message: 20/07/2009, 12h04
  4. Réponses: 3
    Dernier message: 29/10/2007, 18h49
  5. [String] "Nettoyer" un nom de fichier/dossier
    Par Wookai dans le forum Langage
    Réponses: 5
    Dernier message: 16/08/2006, 12h27

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