chemin relatif défini par une variable dans fopen

Eléphanteau du PHP | 37 Messages

14 mars 2011, 12:24

Bonjour,

Voici le petit problème sur lequel je bute :

Après traitement de mon document xhtml, je dois générer un fichier résultat (dont le nom est enregistré dans une variable $nom_fichier) dans un répertoire enregistré dans une variable $repertoire.

Ce répertoire est au même niveau que celui qui contient le fichier php.
Le chemin du fichier à enregistrer est donc ../$repertoire/$nom_fichier.

Comment dois-je utiliser fopen ?

J'ai essayé deux approches :
$chemin_fichier = "../" . $repertoire . "/" . $nom_fichier;
$fichier_resultat = fopen($chemin_fichier, 'w');
;
$fichier_resultat = fopen("../" . $repertoire . "/" . $nom_fichier, 'w');
Dans les deux cas, j'obtiens le message "failed to open stream: No such file or directory in <nom du fichier php> on line <n° de la ligne fopen>".

(J'ai bien vérifié : le répertoire contenu dans la variable $repertoire est correct.)

Merci d'avance pour votre aide

ViPHP
xTG
ViPHP | 7331 Messages

14 mars 2011, 13:47

.. pointe-t-il sur un dossier accessible web ?

Ce que tu essayes d'accéder :

Code : Tout sélectionner

root : - script - script_fopen.php - $répertoire - $nom_fichier
Est-ce bien l'architecture que tu as ?

Eléphanteau du PHP | 37 Messages

14 mars 2011, 16:23

Merci de ta réponse,

Oui, c'est bien la structure que j'ai.
Et l'alias d'Apache pointe bien sur le répertoire racine (root dans ton exemple).

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

14 mars 2011, 18:51

salut,

a tu afficher $chemin_fichier pour contrôler le chemin ?

A tu vérifier le chmod ?

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 37 Messages

14 mars 2011, 19:24

Merci de tes questions qui ont orienté ma recherche (en fait, c'est la première question qui a orienté ma recherche ; je n'ai pas compris la seconde)

Je pense avoir trouvé la cause du problème :

En fonction de la valeur d'un paramètre $langue_source (french, english, spanish...) j'enregistre le fichier $nom_fichier dans le répertoire correspondant :

"Version française" pour $langue_source = 'français'
'Version anglaise" pour $langue_source = 'anglais'
etc.

Visiblement, c'est le ç de "Version française" qui pose problème. (J'ai essayé avec $langue_source = 'anglais' , ça marche bien.)
Visiblement php n'aime pas rencontrer des caractères aussi exotiques dans un répertoire.


Question : Comment faire pour conserver le répertoire "Version française" avec le ç et ne pas imposer "Version francaise" ?

ViPHP
xTG
ViPHP | 7331 Messages

14 mars 2011, 23:11

Cela ne vient pas de PHP mais du système d'exploitation. ;)
Il faut toujours penser à ne jamais mettre de caractères spéciaux dans les noms de fichier.

Eléphanteau du PHP | 37 Messages

15 mars 2011, 00:20

Certes.

Mais alors pourquoi mon navigateur Windows accepte les caractères spécifiques au français et que les fichiers dont le nom contient ces caractères sont lus sans problème par quasiment toutes mes applications, à commencer par Word ?

Pourquoi mes navigateurs Web (IE8, FF, Opera, GC...) acceptent des url contenant aussi bien ces caractères que des guillemets simples ou doubles, sans compter plein d'autres caractères, dans les répertoires comme dans le nom du fichier ?

Par ailleurs, je ne suis pas maître du nom de fichier contenu dans la variable $nom_fichier. Dans le cas présent, ce nom est déterminé à partir du titre du document que mon script php doit traiter et je ne sais absolument pas à l'avance quels caractères nationaux l'auteur du document va utiliser. (Les documents traités seront écrits en plusieurs langues, dont le français, le tchèque et le portugais qui comptent à eux trois pas mal de caractères spécifiques.)

A terme aussi, je ne serai pas maître du nom de répertoire contenu dans la variable $repertoire.

Je voudrais donc pouvoir traiter un chemin, nom de fichier compris, contenant des caractères nationaux.

Comment puis-je donc faire pour ne pas rencontrer des surprises comme celle décrite dans mon précédent message ?

PS : Je continue le sujet dans un autre post avec un titre évoquant explicitement cette question