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 :

Noms de fichiers accentués.


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Noms de fichiers accentués.
    Bonjour,

    Récemment, j'ai créé une procédure PHP qui exploite des fichiers sur Windows. Cela marche très bien sauf pour les fichiers dont le nom possède des lettres accentuées (fopen renvoie une erreur).
    y-a-t-il un moyen de résoudre ce problème ?. J'ai essayé aussi d'utiliser utf8_encode mais sans succès (c'est pire même).

    Je suis étonné que fopen se plante, car par exemple si j'ouvre un répertoire avec opendir($dir ) et que le répertoire possède aussi des lettre accentuées cela marche très bien.
    Qu'est qui fait que ce soit une restriction sous php car les autres logiciels que j'utilise (en particulier des éditeurs de textes) ne posent aucun problème pour ouvrir ces fichiers.

    Je suppose que je ne suis pas le premier à avoir ce genre de souci, bien que je n'ai pas trouvé d'entrée dans Q&A (mais peut-être ai-je mal cherché).
    Évidemment, l'idéal serait de ne pas avoir de tels noms de fichiers, mais je ne suis pas maître des noms affectés par les utilisateurs car il faut tenir compte de l'historique de plusieurs années.

    Quelqu'un pourrait-il proposer une solution ?

    Merci d'avance

    Gégé

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quand tu dis que c'est pire avec utf8_encode() tu veux dire quoi ?
    Comment produis-tu le nom du fichier que tu cherches à ouvrir ?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Lorsque j'utilise utf8_encode fopen renvoie un message d'erreur en remplaçant les caractères accentués par n'importe quoi (apparemment). Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: fopen(Nationalité.txt): failed to open stream: No such file or directory in E:\xampp\htdocs\Boscq\explications.php on line 7
    alors que si je n'utilise pas utf8 j'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: fopen(Nationalité.txt): failed to open stream: No such file or directory in E:\xampp\htdocs\Boscq\explications.php on line 7
    Voici mon programme test.

    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
    $str="";
    setlocale(LC_ALL, 'fr_FR'); 
    $fichier =   "Nationalité.txt"  ;
    //  $fichier = utf8_encode($fichier);   // c'et pire
    $handle= fopen($fichier,"r");
    if ($handle) 
     {
        while (($line = fgets($handle)) !== false) 
        {
            $str .= $line."<br>";
        }
    } 
    else 
    {
         $str = 'Fichier : "'.$fichier.'" non trouvé';
    } 
     
    echo  $str;
     fclose( $handle);
    ?>

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Quel est l'encodage du fichier .php et que l'est l'encodage du document HTML ?

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Effectivement il y avait des différences d'encodage entre mon fichier HTML et PHP l'un : iso-8859-2 et l'autre utf-8. J'ai modifié cela avec mon éditeur, j'ai vérifié, tout est en utf-8 ainsi que dans la balise :
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" />


    Si je code en dur "$fichier = "Nationalité.txt" cela marche très bien. L'ouverture se fait bien et je peux lire les lignes du fichier ( en commentaire dans le code ci-dessous).
    Par contre si je passe le nom du fichier via Javascript et Ajax, cela ne marche plus. Pourtant l'affichage du nom du fichier en entrant dans la procédure php, est OK.
    Voila le résultat de l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
             Nationalité
     
             Warning: fopen(Nationalité.txt): failed to open stream: No such file or directory in E:\xampp\htdocs\Boscq\explications.php on line 9
            Fichier : "Nationalité.txt" non trouvé
    Je dois dire que tout cela me laisse très perplexe.

    Merci beaucoup pour ton aide et l’intérêt que tu portes à mon problème.

    Fichier HTML :

    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR">
    <head> 
    <meta http-equiv="content-language" content="fr-FR" />
    <meta name="language" content="fr-FR" />
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> 
    <meta http-equiv="Cache-Control" content="no-store" />
    <meta http-equiv="Cache-Control" content="no-store" />
    <link rel="stylesheet" href="cinephil.css"> 
    <script src="https://code.jquery.com/jquery-2.1.0.min.js"></script> 
    <script src="https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <link rel="stylesheet" href="https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"> 
    <script>
     var monString=""; 
    function executeAjax(id,url,parm,mode)
    {
    	 $.ajax({
    	  	 type: 		"POST",
    	 	 url:    	url,
    	 	 data:   	{options: parm} , 
    	 	 async: 	mode,
    	 	 dataType: 	'html',
    	 	 cache:		false,
    	 	 success:  	function( msg )
    	 	 		{
    					$(id).html( msg );
    				} 
    	 	});
    	return monString;
    }
    function lancer(champ)
    {
    	wk= executeAjax("#Test","explications.php", champ,false); 
    }
    </script>
    </head>
    <body ><center>
    <form>
    Cliquez sur le bouton pour ouvrir le fichier "Nationalité.txt"<p> 
    <input type='button' value='Cliquez'  onClick='lancer("Nationalité");'/> 
    </form>
    <div id="Test"></div>
    </body></html>
    Fichier Explications.php :
    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
     
    <?php
     if (! isset($_POST['"options']))    $champ = $_POST["options"];   // on récupère le nom du champs  appelé via AJAX. 
     else die("");
     echo  $champ."<br>" ;
    $str="";
    setlocale(LC_ALL, 'fr_FR'); 
    $fichier =  $champ.".txt"  ;
     // $fichier = "Nationalité.txt";
    $handle= fopen($fichier,"r");
    if ($handle) 
     {
        while (($line = fgets($handle)) !== false) 
        {
            $str .= $line."<br>";
        }
         fclose( $handle);
    } 
    else 
    {
         $str = 'Fichier : "'.$fichier.'" non trouvé';
    } 
     
    echo  utf8_encode($str);
     
    ?>

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    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 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Avec jquery tu peux utiliser serialize pour récupérer l'ensemble des post du formulaire. Sinon tu peux utiliser $.param pour passer des valeurs choisies. La particularité de ces fonctions est qu'elles appliquent la fonction javascript encodeURIComponent ce qui permet de protéger les caractères spéciaux. Côté php tu pourras récupérer avec rawurldecode.

    Après j'espère que ton code n'est qu'un exemple car sans contrôle des fichiers c'est un gouffre de sécurité.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Merci je vais essayer de faire ce que tu dis. Je posterai ici les résultats
    Concernant la sécurité, effectivement ce n'était qu'un exemple.

    Merci encore

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Ouf !! Enfin ça marche avec les conseils que tu m'as prodigués. J'ai simplement dû ajouter utf8_decode pour que le nom du fichier soit accepté par fopen.
    Ci-dessous mes deux fichiers. Cela pourrait servir à d'autres éventuellement, même si le codage n'est pas vraiment dans l'état de l'art (ce ne sont que des tests).

    Encore un grand merci à toi, car sans cela j'y serais encore.

    Gégé

    Fichier HTML d'appel :
    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
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"          "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr-FR">
    <head> 
    <meta http-equiv="content-language" content="fr-FR" />
    <meta name="language" content="fr-FR" />
    <meta http-equiv="Content-type" content="text/html; charset=UTF-8" /> 
    <meta http-equiv="Cache-Control" content="no-store" />
    <meta http-equiv="Cache-Control" content="no-store" />
    <link rel="stylesheet" href="cinephil.css"> 
    <script src="https://code.jquery.com/jquery-2.1.0.min.js"></script> 
    <script src="https://code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
    <link rel="stylesheet" href="https://code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css"> 
    <script>
    var monString=""; 
    function executeAjax(id,url,parm,mode)
    {
    	 $.ajax({
    	  	 type: 		"POST",
    	 	 url:    	url,
    	 	 data:   	{parm} , 
    	 	 async: 	mode,
    	 	 dataType: 	'html',
    	 	 cache:		false,
    	 	 success:  	function( msg )
    	 	 		{
                                            monString = msg;
    					$(id).html( msg );
    				} 
    	 	});
    	return monString;
    }
    function lancer(champ)
    {
               params =  $.param( $('form input') );
    	   wk= executeAjax("#Test","explications.php", params,false); 
    }
    </script>
    </head>
    <body ><center>
    <form>
    Cliquez sur le bouton pour ouvrir le fichier "Nationalité.txt"<p> 
    <input type="hidden" name="p1" value="Nationalité" /> 
    <input type='button'  name="b1" value="Cliquez"  onClick='lancer();'/> 
    </form>
    <div id="Test"></div>
    </body></html>
    Fichier PHP : Explications
    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
    <?php
    setlocale(LC_ALL, 'fr_FR');
    if (isset($_POST['parm'])) $wk = rawurldecode($_POST["parm"]) ;   
    else  die("Pas de liste de paramètres");
    $tab = explode("&",$wk);
    $champ=""; 
    for ($i = 0; $i<count($tab) ; $i++)
    {
    	$wk = explode("=",$tab[$i]);
    	if ($wk[0] = "p1")  {$champ=$wk[1]; break;}
    }
    $fichier = utf8_decode($champ).".txt"  ;
    if ( !file_exists ($fichier )) die("Le fichier \"".utf8_encode($fichier."\" n'existe pas dans le répertoire prévu"));
    try
    {
    	$handle= fopen($fichier,"r");
    	$str="";
    	while (($line = fgets($handle)) !== false) 
    	{
    		 $str .= $line."<br>";
    	}
    	fclose( $handle);
    }
    catch (Exception $ex) { $str = 'Exception reçue : '.  $ex->getMessage(). "\n";}
    echo  utf8_encode($str);
    ?>

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

Discussions similaires

  1. [Encodage] Noms de fichiers accentués dans une archive Zip
    Par micetf dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2010, 20h50
  2. Nom de fichiers accentués
    Par isildur37 dans le forum C++
    Réponses: 2
    Dernier message: 15/05/2009, 11h07
  3. zipfile nom de fichier accentués
    Par jihemd dans le forum Général Python
    Réponses: 2
    Dernier message: 22/12/2006, 00h09
  4. [Upload] Nom de fichier avec un/des caractères accentués ?
    Par Christophe Charron dans le forum Langage
    Réponses: 11
    Dernier message: 09/06/2006, 21h46
  5. nom de fichier et variables d'environnement
    Par joebarthib dans le forum Langage
    Réponses: 2
    Dernier message: 18/07/2002, 15h21

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