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 :

Fonctions basename, rename et UTF-8


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut Fonctions basename, rename et UTF-8
    Bonjour,

    Je récupère par le biais d'un champ input de type "file" le chemin d'un fichier jpg. Avec la fonction basename, j'extrais de ce chemin le nom du fichier que je stocke dans une 1ere variable ($file_recto_img_initiale).
    Si besoin je "nettoie" le nom du fichier (notamment pour éviter les accents et les espaces) avec une Regex et stocke le résultat dans une 2nd variable ( $file_recto_img_new). Enfin, grâce à la fonction rename, je modifie le nom du fichier en question sur mon disque dur (je travaille en localhost et il n'est pas question d'upload).
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
     
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
     
    <head>
     
    <!--pas de charset indiqué-->
     
    <?php
     
    if(isSet($_POST["btSubmit2"])) {
     
     
    $recto_img_initiale=mysql_real_escape_string(trim($_POST['couverture_recto_insert']));
     
    $file_recto_img_initiale = basename($recto_img_initiale);// pour récupérer le nom du fichier image recto			
     
    //////
    $recto_img_new=mysql_real_escape_string(trim($_POST['couverture_recto_insert']));
    $file_recto_img_new = basename($recto_img_new);			
     
    $file_recto_img_new = preg_replace('/([^.a-z0-9]+)/i', '-', $file_recto_img_new);
     
     
    rename("couvertures/$file_recto_img_initiale ", "couvertures/$file_recto_img_new" ); 
     
    }
     
    ?>
    </head>
     
    <form method="POST" action="" >
    <p>
    <label for="couverture_recto_insert">Couverture recto:</label>
     
    <input type="file"  name="couverture_recto_insert" >  
     
    <input type="submit" value="Enregistrer le livre"name="btSubmit2" id="btSubmit2" /> 
     
    </p>
    </form>
    Mon code fonctionne. Sauf si j'indique dans le head le charset suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    cela ne fonctionne plus car j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "Warning: rename(couvertures/ramé.jpg ,couvertures/ram-.jpg) [function.rename]: No error in C:\WAMP\www..."
    //dans cet exemple $file_recto_img_initiale vaut "ramé".
    La fonction rename est-elle allergique à l'UTF-8 ? A moins que cela soit la fonction basename ? Je suis débutant, voyez-vous une explication à ce dysfonctionnement ? Merci.

  2. #2
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 563
    Points : 2 390
    Points
    2 390
    Par défaut
    Si tu veux que ton site soit encodé en UTF8, il faut aussi que ton fichier soit en UTF8.

    Par exemple sous Notepad++ : Encodage > Convertir en UTF-8
    Zend Certified PHP Engineer

    « Crois-tu comprendre le monde juste en matant le 20H Ou connaître l'histoire en ayant lu que l'angle des vainqueurs ? » Keny Arkana

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Effectivement. Mais mon fichier était déjà converti en UTF-8 sans BOM. Le problème demeure donc. Avez-vous une autre idée ? Merci.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    basename dépend de la locale, donc si le fichier a des accents et compagnie ça coince, je te conseil de pas faire de basename sur le nom reel (ça sert a rien en plus)

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci pour ta proposition mais pourrais-tu expliciter STP ? Comment puis-je alors récupérer le nom du fichier si basename pose problème ? Merci.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Mon problème particulier a trouvé sa solution en passant par un réencodage de UTF-8 => CP1252 de ma variable $file_recto_img_initiale. Sans cela la fonction rename aboutissait à l’erreur mentionnée.

  8. #8
    Membre actif
    Homme Profil pro
    PHP - HTML5 - CSS3 - Laravel/Symfony - C/C++ - python
    Inscrit en
    Juillet 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : PHP - HTML5 - CSS3 - Laravel/Symfony - C/C++ - python

    Informations forums :
    Inscription : Juillet 2012
    Messages : 63
    Points : 264
    Points
    264
    Par défaut exemple de code
    voici un exemple de code sous windows XP qui utilise bien l'encodage CP1252 pour les noms de fichiers...http://fr.wikipedia.org/wiki/Windows-1252
    dans l'exemple ci-dessous, j'ai juste créé un fichier nommé tést.txt et à l'issue de l'exécution de ce script, il est bien renommé test.txt
    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
    <head>
    <title>test fonction PHP rename() </title> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
     
    <body>
    <?php
     
    $nomfichierinitial=iconv("UTF-8", "CP1252", "C:\\wamp\\www\\tést.txt");
    $nomfichierfinal="C:\\wamp\\www\\test.txt";
    rename($nomfichierinitial, $nomfichierfinal);
    ?>
     
    </body>
    </html>
    à associé à la fonction PHP preg_replace pour aller plus loin !

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Je confirme, cela fonctionne

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

Discussions similaires

  1. Fonction Mail et encodage UTF-8
    Par mikael2235 dans le forum Langage
    Réponses: 6
    Dernier message: 19/12/2012, 05h36
  2. quel header pour la fonction basename?
    Par Aldian dans le forum Bibliothèques
    Réponses: 2
    Dernier message: 12/06/2008, 23h46
  3. Probleme avec la fonction rename()
    Par TheZenZen dans le forum C
    Réponses: 6
    Dernier message: 08/10/2005, 15h59
  4. Réponses: 6
    Dernier message: 04/10/2005, 17h37
  5. fonction basename
    Par niko8181 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/04/2005, 09h34

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