Précédent   Forum des professionnels en informatique > PHP > Langage > Fichiers
Fichiers Forum d'entraide sur les fichiers avec PHP. Avant de poster -> FAQ fichiers et Sources fichiers
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/01/2008, 11h11   #1
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
Par défaut [FTP] OpenDir() et chemin avec des caractères spéciaux (', é, etc)

Salut à tous,

J'ai un petit soucis.

Dans le cadre d'une gallerie Photo/Vidéo que je suis en train de coder, je propose de déposer ses dossiers directement par FTP et ensuite la gallerie s'occupe de tout (création des miniatures, conversion des videos en FLV ...) ...

Le pb, c'est que je peux avoir des répertoires avec des caractères spéciaux genre "Ski au Val d'allos" qui comprend ici le ' ...

Il me dit alors qu'il n'arrive pas à ouvrir le dossier car il n'existe pas ...

Pour les caractères accentués, j'ai utilisé la fonction urlencode() et urldecode() et cela fonctionne mais pas pour le ' ...

Quand je passe en ligne de commande sur mon dédié, je vois que pour entre dans ce dossier, il protège les caractères mais je ne trouve pas de fonctions PHP me permettant cela ...

Connaissez-vous une solution pour pouvoir utiliser ces noms de dossiers spéciaux ?

Merci d'avance
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 12h30   #2
Membre expérimenté
 
Inscription : août 2005
Messages : 515
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 515
Points : 557
Points : 557
Bonjour,
quand vous parlez de protéger le caractère < ' > vous parlez de < \' > et du caractère d'échappement < \ >?

Du reste, pour urlencode :

Code :
1
2
3
4
5
6
7
<?php
 
  echo urlencode('J\'ai fait un rêve!');
 
  // aura pour résultat : J%27ai+fait+un+r%EAve%21
 
?>
Donc je ne comprends pas trop votre problème.

Cordialement,
DaRiaN.
DaRiaN est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 13h12   #3
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Ici, le système de fichiers Unix n'est pas celui de Windows. Il n'accèpte pas les espaces et les caractères accentués pour les noms de fichiers et dossiers. Perso, j'ai réalisé une petite fonction qui va remplacer les accents par des lettres sans accents (minuscules et majuscules), va également remplacer les lettres particulières comme œ par les 2 caractères oe, puis va remplacer tous les autres caractères spéciaux par un souligné (_). Ce qui donnerait dans ton exemple : Ski_au_Val_d_allos

Voir du côté de la fonction strtr...
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 13h36   #4
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
Citation:
Envoyé par DaRiaN Voir le message
Bonjour,
quand vous parlez de protéger le caractère < ' > vous parlez de < \' > et du caractère d'échappement < \ >?

Du reste, pour urlencode :

Code :
1
2
3
4
5
6
7
<?php
 
  echo urlencode('J\'ai fait un rêve!');
 
  // aura pour résultat : J%27ai+fait+un+r%EAve%21
 
?>
Donc je ne comprends pas trop votre problème.

Cordialement,
DaRiaN.
Salut,
Merci de la réponse.

Exemple simple, j'ai un repertoire "2003-12-21__Ski au Val d'Allos".
Je clique sur un lien qui me passe le repertoire en paramètre de l'URL genre :
Code :
index.php?action=lister&folder=Photos%2F2003%2F2003-12-21__Ski+au+Val+d%27Allos%2F
Quand j'arrive sur la page où je fais un OpenDir(), j'ai :
Code :
Warning: opendir(Photos/2003/2003-12-21__Ski au Val d\'Allos/) [function.opendir]: failed to open dir: No such file or directory
Merci.
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 13h39   #5
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
Citation:
Envoyé par Sub0 Voir le message
Ici, le système de fichiers Unix n'est pas celui de Windows. Il n'accèpte pas les espaces et les caractères accentués pour les noms de fichiers et dossiers. Perso, j'ai réalisé une petite fonction qui va remplacer les accents par des lettres sans accents (minuscules et majuscules), va également remplacer les lettres particulières comme œ par les 2 caractères oe, puis va remplacer tous les autres caractères spéciaux par un souligné (_). Ce qui donnerait dans ton exemple : Ski_au_Val_d_allos

Voir du côté de la fonction strtr...
Salut,

Le truc, c'est que ce repertoire existe bien, il est pris en compte par Linux ... Et si je me met en ligne de commande, je peux y accèder en tappant :

Code :
cd 2003-12-21__Ski\ au\ Val\ d\'Allos/
Il me protège les caractères spéciaux... Il n'existe pas de fonction qui fasse cela en automatique ?

Sinon, serait-il possible de me montrer la tienne ?

Merci d'avance
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 13h59   #6
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Citation:
Envoyé par Sebastos Voir le message
Code :
cd 2003-12-21__Ski\ au\ Val\ d\'Allos/
Il me protège les caractères spéciaux... Il n'existe pas de fonction qui fasse cela en automatique ?
Oui. Essaye avec AddSlashes() pour protéger les caractères spéciaux.

Code :
$chaine=AddSlashes($chaine);
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 14h04   #7
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
Citation:
Envoyé par Sub0 Voir le message
Oui. Essaye avec AddSlashes() pour protéger les caractères spéciaux.

Code :
$chaine=AddSlashes($chaine);
J'ai essayé mais cela ne fonctionne pas ... En fait, la chaine est déja protégée quand je la passe en paramètre (GET) puisque qu'il m'affiche bien le antislash dans le nom de dossier :

Code :
Warning: opendir(Photos/2003/2003-12-21__Ski au Val d\'Allos/)
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 14h42   #8
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Ok.
A la réception de ta chaine, Il faut (si nécessaire) enlever les antislaches de protection, sinon, tu risques de les doubler...
Utilises la fonction StripSlashes();

Mais en fait, je te conseillerais plutôt d'utiliser urlencode() si la chaîne passe par GET , puis urldecode() pour la réceptionner : $chaine=urldecode(@$_GET['folder']);

Essaye aussi d'ajouter des guillemets avec opendir : $chaine='"'.$chaine.'"';

Si rien ne fonctionne, montre-nous ce que tu obtiens comme chaine avec ces fonctions.
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 15h47   #9
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
C'est justement ce que je fais, mais je crois que cela ne fonctionne que pour les caractères accentés et autres ...

Voici les étapes de mon process :

1 ) Je passe mon URL dans un lien avec urlencode() :
Code :
$_strLink = '?action=lister&folder='.urlencode($myFolder);
ce qui me donne quand je survole le lien :
Code :
index.php?action=lister&folder=2003-12-21__Ski+au+Val+d'Allos
et au final quand je clique dessus, j'ai dans la barre d'adresse :
Code :
index.php?action=lister&folder=Photos%2F2003%2F2003-12-21__Ski+au+Val+d%27Allos%2F
2) Je récupère mon URL gràce à urldecode() :
En brut (sans encore éxécuter urldecode()), je récupère avec $_GET['folder] :
Code :
Photos/2003/2003-12-21__Ski au Val d\'Allos/
et après le urldecode() :
Code :
Photos/2003/2003-12-21__Ski au Val d\'Allos/
Ce qui est la même chose semble-t'il ...

Et j'ai bien sur mon erreur OpenDir() ...
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 15h49   #10
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
C'est bon, j'ai la solution :

Il faut que je fasse :
Code :
$rep = stripslashes(urldecode($_GET['folder]));
Et là ça marche ...

Par contre, du coup, a quoi me sert le urldecode puisque les URL semblaient etres les mêmes (voir mon post au dessus) ?

Merci.
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 17h55   #11
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Les caractères spéciaux / accentués ne sont pas supportés dans les url... Les fonctions UrlEncode() et UrlDecode() permettent de résoudre (en partie) ce problème. Pour ma part, je préfère utiliser mes propres fonctions d'encodage : StrToHexStr() et HexStrToStr() -> Les chaînes étant complètement codées avec la valeur ASCII des caractères, je n'ai pas besoin de les traiter avec AddSlashes() et StripSlaches(). D'ailleurs si tu es intérressé pour les essayer, dis le moi, que je poste le code.
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2008, 18h18   #12
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
Sub0,

J'allais justement te demander si cela ne te dérangerait de poster tes méthodes

Je suis intéressé en effet, cela résoudrait pas mal de soucis, je n'y aurais pas pensé.

Merci d'avance
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 10h36   #13
Expert Confirmé
 
Avatar de Sub0
 
Homme
Inscription : décembre 2002
Messages : 3 468
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 39

Informations forums :
Inscription : décembre 2002
Messages : 3 468
Points : 3 115
Points : 3 115
Envoyer un message via MSN à Sub0 Envoyer un message via Skype™ à Sub0
Code :
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
//=============================================
function StrToHexStr($instr){
  if(empty($instr)) return '';
  $count=0; 
  $outstr='';
  $len=strlen($instr);
  if($len>0)
    while($count<$len){ 
      $outstr.=@dechex(ord($instr{$count})); 
      $count++; 
    } 
  return strtolower($outstr);
}
 
//=============================================
function HexStrToStr($instr){
  $instr=trim($instr);
  if(empty($instr)) return '';
  $count=0; 
  $outstr='';
  $len=strlen($instr);
  if($len>0)
    while($count<$len){ 
      $outstr.=@chr(hexdec(
        $instr{$count}.$instr{$count+1})); 
      $count+=2; 
    }
  return $outstr;
}
Sub0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/01/2008, 10h56   #14
Invité régulier
 
Inscription : avril 2004
Messages : 26
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 26
Points : 7
Points : 7
Envoyer un message via MSN à Sebastos
Merci bien Sub0.

Je vais tester ça.

@++ et merci encore
Sebastos est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h41.


 
 
 
 
Partenaires

Hébergement Web