Précédent   Forum des professionnels en informatique > PHP > Langage
Langage Forum sur le langage PHP, la POO, les conventions, la sécurité, etc. Avant de poster : FAQ Langage, toutes les FAQ PHP, cours langage et sources PHP
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 14/06/2011, 16h30   #1
Membre du Club
 
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 43
Points : 43
Par défaut Problème upload de fichier avec accent et firefox

Bonjour à tous,

Je bloque sur un problème assez énervant (pour rester poli) qui n'apparaît que sous Firefox.

En fait, je suis en train de créer un formulaire d'upload de photo et je ne souhaite pas stocker des photos avec accent, pour cela je me suis fait une petite fonction qui transforme mon nom de fichier "francais" en nom de fichier tout ce qu'il y a de plus "ascii" .

Code :
1
2
3
4
5
6
7
function clean_french_string($str){
    $search  = array('à','á','â','ã','ä','ç','è','é','ê','ë','ì','í','î','ï','ñ','ò','ó','ô','õ','ö','ù','ú','û','ü','ý','ÿ', 'À','Á','Â','Ã','Ä','Ç','È','É','Ê','Ë','Ì','Í','Î','Ï','Ñ','Ò','Ó','Ô','Õ','Ö','Ù','Ú','Û','Ü','Ý');
    $replace = array('a','a','a','a','a','c','e','e','e','e','i','i','i','i','n','o','o','o','o','o','u','u','u','u','y','y', 
        'A','A','A','A','A','C','E','E','E','E','I','I','I','I','N','O','O','O','O','O','U','U','U','U','Y');
    $str = str_replace($search, $replace, $str);
return $str;
}
J'aurai pu aussi utiliser preg_replace, je sais mais bon, j'ai testé j'ai le même problème.

Voici le code de mon formulaire HTML (la page est encodée en utf-8):
Code :
1
2
3
4
5
6
7
 
<form method="post" 
    action="http://www.lienvers.com/monfichier.php" enctype="multipart/form-data">    
          <input type="hidden" name="MAX_FILE_SIZE" value="2097152">    
          <input type="file" name="image">   
          <input type="submit" value="Envoyer">   
</form>
Et voici comment je traite le fichier côté php (fichier php encodé en UTF-8 lui aussi) :

Code :
1
2
3
4
5
 
$real_name = $_FILES['image']['name'];
print("Filename before = " . $real_name);
$new_name = clean_french_string($real_name);
print("\nFilename after = " . $new_name);
Je fais d'autres traitements sur mon image mais ils ne sont pas importants.

Maintenant, testez cela dans firefox 4 avec un fichier qui comporte des accents dans le nom et vous verrez qu'il ne fait rien!!
En tout cas, ça me fait ça sous Mac OS.

J'ai testé avec Chrome, ça marche, j'ai testé sous IE 8 ça marche aussi...

Ce qui m'intrigue le plus c'est que lorsque je fais un mb_detect_encoding sur mon nom de fichier, il détecte bien qu'il est en UTF-8.

Quelqu'un a déjà eu ce problème ? Est-ce que ça vient de ma version de PHP qui est trop vieille (5.2.4) ? Est-ce que ça vient la fonction que j'utilise ? Ou autre ?

Je précise aussi que quand j'enregistre le fichier sur le disque dur, le nom n'est pas bon, par exemple si j'ai un fichier qui s'appel "Rémi.png" (et qu'il s'affiche comme tel quand je fais un print) il s'enregistrera sous "ReÌmi.png", ce qui fait tout de même penser à un problème d'encodage...

Merci à vous,
Andréas

P.S : J'ai le même problème quand le fichier est contenu dans une archive et là ce me le fait même avec Chrome, étrange...
dedesite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 23h54   #2
Membre éclairé
 
Avatar de beejeridou
 
Homme
Webmaster
Inscription : février 2007
Messages : 261
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Bas Rhin (Alsace)

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : février 2007
Messages : 261
Points : 315
Points : 315
Que vaut $str avant de passer dans clean_french_string() ?
__________________
Et pourtant... Elle tourne.
http://www.artisan-developpeur.fr
beejeridou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 01h09   #3
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Oui apparemment c'est un problème d'encodage dans ta page. Il doit manquer une étape dans ton script pour un encodage cohérent du début à la fin de ton code. Un tuto ici

Sinon je viens de poster une classe d'upload facilement paramétrable et prête à l'emploi. Le dernier exemple est en utf-8. Tu peux regarder ou utiliser la classe car elle fait les mêmes remplacements que les tiens (même un peu plus).
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h14   #4
Membre du Club
 
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 43
Points : 43
Bonjour,

Merci pour vos réponses .

Citation:
Que vaut $str avant de passer dans clean_french_string() ?
Quand je fais un print, ça m'affiche le bon nom avec les accents. Et quand j'affiche l'encodage avec mb_detect_encoding, la chaine est bien reconnue comme étant en UTF-8.

Citation:
Oui apparemment c'est un problème d'encodage dans ta page. Il doit manquer une étape dans ton script pour un encodage cohérent du début à la fin de ton code. Un tuto ici
Merci pour le tuto, mais mon cas est assez simple, il n y a même pas de base mysql. J'ai ma page html en UTF-8 (j'ai vérifié les entête http et elles sont bien en UTF-8) et mon fichier php qui est lui aussi bien encodé en UTF-8.

Citation:
Sinon je viens de poster une classe d'upload facilement paramétrable et prête à l'emploi. Le dernier exemple est en utf-8. Tu peux regarder ou utiliser la classe car elle fait les mêmes remplacements que les tiens (même un peu plus).
Oulà, 1200 lignes pour gérer l'upload d'image et le redimensionnement, non merci . Je fais ça en moins de 200 lignes et encore c'est parcequ'il y a une gestion des d'archives. Bon, c'est sûrement moins complet que ta classe, mais je ne pense pas avoir besoin de tout ça.

Je vais quand même tester voir si j'ai le même problème, je te dirai.

Encore merci à vous, je pense que je vais laissé décanter et bosser sur d'autre chose avant de revenir à ce problème car ça m'a vraiment "frustré"! Le pire c'est que ça me fait ça que sous firefox!
dedesite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 10h42   #5
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par dedesite Voir le message
Oulà, 1200 lignes pour gérer l'upload d'image et le redimensionnement...
Oui enfin y'a beaucoup d'espaces (pour la lisibilité) et aussi beaucoup d'automatismes pour permettre une utilisation facile et rapide avec pas mal de possibilités et accessible au néophyte. Ceci expliquant cela
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h18   #6
Membre du Club
 
Inscription : avril 2005
Messages : 112
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : avril 2005
Messages : 112
Points : 43
Points : 43
Ca y est j'ai trouvé!

Enfin, je n'ai toujours pas compris ce qu'il se passait mais grâce à ton code ABCIWEB ça marche!

En fait, j'ai regardé ta fonction de renommage et elle est quasiment pareille, sauf que tu as rajouté ça après le str_replace :

Code :
$nom_fichier = preg_replace('#[^.a-z0-9_-]+#i', '', $nom_fichier);
Code qui enlève tous les caractères non ASCII en gros et si je rajoute ça à mon code, ça marche sous tous les navigateurs!!

J'ai testé sous firefox en ne laissant que le preg_replace et ça marche! J'en déduis que contrairement à ce que php me dit, ma chaîne n'était pas vraiment encodée en UTF-8 car le str_replace ne faisait rien.

Bref, je ne comprend pas tout mais ça marche et c'est l'essentiel .

Citation:
Citation:
Envoyé par dedesite Voir le message
Oulà, 1200 lignes pour gérer l'upload d'image et le redimensionnement...

Oui enfin y'a beaucoup d'espaces (pour la lisibilité) et aussi beaucoup d'automatismes pour permettre une utilisation facile et rapide avec pas mal de possibilités et accessible au néophyte. Ceci expliquant cela
Oui, c'est sûr que c'est on ne peut plus "didactique" comme code, mais ce n'est pas ce dont j'avais besoin. Puis tout de même la longueur rajoute forcément de la complexité .

Merci à vous et bonne journée,
Andréas
dedesite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h15   #7
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Bah oui ça rajoute de la complexité dans le code interne à la classe, mais c'est au bénéfice de la simplicité du code final externe nécessaire pour paramétrer les fonctions. Enfin bon l'important est que ton pb soit résolu. Bon après midi
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB 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 05h17.


 
 
 
 
Partenaires

Hébergement Web